如何在 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);
}
我有一个包含 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);
}