使用 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);

看起来这是最快的方法。感谢所有建议。