如何在弹簧数据中使用CrudRepository强制预先加载?

2022-09-03 15:30:28

我有一个包含的实体,因此默认情况下加载:Listlazy

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)


答案 1

您可以使用 强制急切提取编写自定义 HQL 查询,例如:left join fetch

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)
}

答案 2

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

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

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


推荐