使用 CrudRepository 进行延迟加载
Lazy loading with CrudRepository
我有一个简单的 parent-child 关系(一对多)。我正在两个端点检索 parents。一个获取 parent 的列表,一个获取单个 parent。在列表上,我不想为每个 parent 序列化一个 children 的列表。我只想在获得单个 parent 时显示 children 的列表。
我正在使用 spring 启动和 CrudRepository。
我试过了
spring.jpa.open-in-view=false
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
也 fetch = FetchType.LAZY
最后,我使用 FETCH 关键字编写自定义 HQL。
Parent 型号
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private List<Child> children;
Child 型号
@Column(name = "parent_id")
@JsonIgnore
private Long parentId;
Parent 存储库
public interface ParentRepository extends CrudRepository<Parent, Long>
Parent 服务
List<Parent> findAll() {
return StreamSupport
.stream(repository.findAll().spliterator(), false)
.collect(Collectors.toList());
}
正如我所说,有时我想在这种关系中序列化 children 的列表,而在某些情况下则不需要。
很可能是因为默认的 Open Session in View。从 2.0 版本开始
如果您在 application.properties 配置文件中添加了以下行,那么它应该可以工作
spring.jpa.open-in-view=false
您可以使用 JsonView 或 JsonFilter 和 Jackson 来完成此操作。另一种选择是分离关注点,即使用 DTO 来控制实体的序列化视图。
这里是 link 关于 Jackson 一些功能的教程:https://www.baeldung.com/jackson-serialize-field-custom-criteria
好的,我终于做到了。我为 Parent 写了一个没有 children 的专用 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);
看起来这是最快的方法。感谢所有建议。
我有一个简单的 parent-child 关系(一对多)。我正在两个端点检索 parents。一个获取 parent 的列表,一个获取单个 parent。在列表上,我不想为每个 parent 序列化一个 children 的列表。我只想在获得单个 parent 时显示 children 的列表。
我正在使用 spring 启动和 CrudRepository。 我试过了
spring.jpa.open-in-view=false
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
也 fetch = FetchType.LAZY
最后,我使用 FETCH 关键字编写自定义 HQL。
Parent 型号
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private List<Child> children;
Child 型号
@Column(name = "parent_id")
@JsonIgnore
private Long parentId;
Parent 存储库
public interface ParentRepository extends CrudRepository<Parent, Long>
Parent 服务
List<Parent> findAll() {
return StreamSupport
.stream(repository.findAll().spliterator(), false)
.collect(Collectors.toList());
}
正如我所说,有时我想在这种关系中序列化 children 的列表,而在某些情况下则不需要。
很可能是因为默认的 Open Session in View。从 2.0 版本开始
如果您在 application.properties 配置文件中添加了以下行,那么它应该可以工作
spring.jpa.open-in-view=false
您可以使用 JsonView 或 JsonFilter 和 Jackson 来完成此操作。另一种选择是分离关注点,即使用 DTO 来控制实体的序列化视图。 这里是 link 关于 Jackson 一些功能的教程:https://www.baeldung.com/jackson-serialize-field-custom-criteria
好的,我终于做到了。我为 Parent 写了一个没有 children 的专用 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);
看起来这是最快的方法。感谢所有建议。