如何在 spring-data 中使用 CrudRepository 强制预加载?

How to force eager loading with CrudRepository in spring-data?

我有一个包含 List 的实体,因此 lazy 默认加载:

interface MyEntityRepository extends CrudRepository<MyEntity, Long> {

}

@Entity
public class MyEntity {
    @Id
    private Long id;

    @OneToMany(mappedBy = "bar") //lazy by default
    private List<Bar> bars;
}

@Entity
public class Bar {
    //some more
}

问题:执行repository.findOne(id)时如何强制预先加载?

我也需要这个,当我在一个服务对象中调用 dao 时,我调用了一个事务,我调用了 get 方法,所以没有异常,我能够获取记录。 类似于 java 8:

public ProductEntity findProduct(int id) {
    ProductEntity p = productRepository.findOne(id);
    p.getPresentations().stream().count();
    return p;
}

p.getPresentations().stream().count(); 将强制获取,我知道这不是一个干净的方法,但它同时完成了工作

您可以使用 left join fetch 强制预先获取编写自定义 HQL 查询,例如:

interface MyEntityRepository extends CrudRepository<MyEntity, Long> {
    @Query("select e from MyEntity e left join fetch e.bar b where e.id = ?1")
    MyEntity findOne(long id)
}

更改映射
@OneToMany(mappedBy = "bar") //lazy by default

@OneToMany(mappedBy = "bar", fetch = FetchType.EAGER) //lazy by default

findAllById() 使用预取,无需自定义。

  interface MyEntityRepository extends CrudRepository<MyEntity, Long> {        
    Optional<MyEntity> findAllById(long id);
}