如何通过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
相关产品推荐
相关产品推荐

