我有一个简单的父子关系(一对多)。我正在两个方面检索父母。一个获得父母名单,一个获得单亲父母。在列表上,我不想序列化每个父母的孩子列表。我只想在有单亲父母时显示孩子名单。
我正在使用Spring Boot和CrudRepository。 我尝试过
spring.jpa.open-in-view=false
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
也是fetch = FetchType.LAZY
,最后,我用FETCH关键字编写了自定义HQL。
父模型
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private List<Child> children;
子模型
@Column(name = "parent_id")
@JsonIgnore
private Long parentId;
父存储库
public interface ParentRepository extends CrudRepository<Parent, Long>
家长服务
List<Parent> findAll() {
return StreamSupport
.stream(repository.findAll().spliterator(), false)
.collect(Collectors.toList());
}
正如我所说,我有时会序列化这种关系中的孩子列表,在某些情况下不是。
答案 0 :(得分:0)
很可能是由于View中的默认打开会话。从2.0版开始
如果您在application.properties配置文件的下面添加了行,那么它将正常工作
spring.jpa.open-in-view=false
答案 1 :(得分:0)
您可以使用带有Jackson的JsonView或JsonFilter来执行此操作。另一个选择是分离问题,即使用DTO来控制实体的序列化视图。 这是有关某些Jackson功能的教程的链接:https://www.baeldung.com/jackson-serialize-field-custom-criteria
答案 2 :(得分:0)
好的,我终于做到了。我为没有孩子的父母写了一份专门的HQL。
@Query("SELECT new Parent(a.parentId, a.name, a.address, a.city) FROM Parent a WHERE a.otherId= :id")
List<Parent> findAllBySomeOtherIdWithoutChildren(@Param("id") Long id);
看来这是最快的方法。感谢您的所有建议。