JPA查询返回Estmt列表时Company类型字段未通过Ajax传递问题求解
问题根因
你遇到的关联字段未返回问题由两个配置共同导致:
Estmt实体的company字段上加了@JsonBackReference注解:该Jackson注解用于避免双向关联循环序列化,标注后序列化JSON时会直接忽略该字段,自然不会返回给前端。- 关联查询配置为懒加载:
@ManyToOne(fetch = FetchType.LAZY)指定了关联查询懒加载,如果你查询完Estmt后没有主动调用getCompany()触发关联查询,JPA不会真实查询Company数据,返回的只是代理对象,序列化也无法拿到有效数据。
解决方案
可以根据你的业务需求选择以下任意一种方案:
- 方案1:移除冗余的
@JsonBackReference注解
从你提供的Company实体代码来看,Company中并没有维护和Estmt对应的双向关联集合,不存在循环序列化的问题,直接删掉company字段上的@JsonBackReference即可。如果后续加了双向关联,可改用@JsonIgnoreProperties({"不需要序列化的关联字段名"})注解配置忽略字段,避免循环引用。 - 方案2:调整关联加载策略,确保拿到真实Company数据
如果业务上每次查询Estmt都需要返回Company信息,直接将fetch = FetchType.LAZY改成fetch = FetchType.EAGER,查询Estmt时会自动关联查询Company数据。
如果不想全局修改加载策略影响其他业务,可以在Repository的查询方法上增加关联抓取配置:
这样查询时会主动关联抓取Company,懒加载场景也能拿到真实数据。@Query("SELECT e FROM Estmt e JOIN FETCH e.company") List<Estmt> findAllBy(); - 方案3:用DTO做返回字段映射(更规范的工程实践)
不直接把Entity实体返回给前端,自定义EstmtRespDTO,声明需要返回的字段(包括你需要的Company相关字段如cmpId、cmpNm等),查询到Estmt实体后手动或者通过MapStruct等工具把字段映射到DTO中再返回,既避免了序列化问题,也不会暴露实体的冗余字段,安全性更高。
内容的提问来源于stack exchange,提问作者baeyeongbin
相关产品推荐
相关产品推荐

