You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过id查询H2数据库中存储的Post记录的content字段

问题原因与解决方案

核心问题定位

  • 你的PostRepository操作的是映射数据库POST表的Post实体类,查询返回的是Post类型实例,而业务方法要求返回PostDetails类型,两者没有继承关系,直接返回会触发类型转换异常,无法正常得到结果。
  • 你额外给PostInfo加了@Entity注解,导致项目启动后会额外生成POST_INFO表,和你存储帖子数据的POST表完全独立,不符合业务设计逻辑,PostInfo和PostDetails本质是数据传输对象(DTO),不应该加JPA实体注解。

修复步骤

1. 调整DTO类定义

移除PostInfo和PostDetails的JPA相关注解,明确其作为数据传输对象的定位:

// PostInfo类
@Data
@ToString
public class PostInfo {
    private Long id;
    private String title;
}

// PostDetails类
@Data
@ToString
public class PostDetails extends PostInfo {
    private String content;
}

2. 修正业务层查询转换逻辑

查询得到Post实体后,手动转换为PostDetails对象返回,同时增加空值处理逻辑,避免直接调用get()抛出无元素异常:

@Override
public PostDetails getPostDetails(Long id) {
    Post post = postRepository.findById(id)
            .orElseThrow(() -> new IllegalArgumentException("未找到ID为" + id + "的帖子"));
    PostDetails postDetails = new PostDetails();
    postDetails.setId(post.getId());
    postDetails.setTitle(post.getTitle());
    postDetails.setContent(post.getContent());
    return postDetails;
}

可选优化

如果需要简化实体到DTO的转换逻辑,可以使用BeanUtils.copyProperties()工具类批量复制同名属性:

@Override
public PostDetails getPostDetails(Long id) {
    Post post = postRepository.findById(id)
            .orElseThrow(() -> new IllegalArgumentException("未找到ID为" + id + "的帖子"));
    PostDetails postDetails = new PostDetails();
    org.springframework.beans.BeanUtils.copyProperties(post, postDetails);
    return postDetails;
}

额外排查点

如果修复后仍查询不到数据,可以打印日志确认请求传入的id值是否和POST表中存储的id值一致,findAll()返回的列表里的id可以作为对照参考。

内容的提问来源于stack exchange,提问作者Karanja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 14:27:02