我有一个查询,用于在页面中获取实体。每页包含100个实体。对于这100个实体,我需要获取一些懒惰的嵌套实体。
发生的是,我对主要实体执行了1个SELECT,然后对嵌套实体执行了100个SELECT。
我正在寻找一种方法来批量初始化这100个嵌套对象,这样一来,对于主实体我总共有1个SELECT元素,对于嵌套实体有1个SELECT元素。
我的结构如下,如果不更改(我在EAGER抓取中遇到很多问题),我希望这样做
public class MyMainEntity {
private NestedEntity nested;
@Override
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(foreignKey = @ForeignKey(name = "exFK_Nest_Enth"))
public NestedEntity getNested() {
...
}
是否可以使用Hibernate.initialize()
答案 0 :(得分:0)
您可以使用休眠条件查询来获取MyMainEntity并使用criteria.createAlias(“ nested”,“ ns”,Criteria.Subselect)。它将触发两个查询;一个用于获取MyMainEntity,另一个用于与MyMainEntity查询嵌套作为子查询。如果使用Criteria.Join,它将仅触发一个查询并同时获取MyMainActivity和Nested
答案 1 :(得分:0)
默认情况下,休眠最新版本遵循 JPA 2.0规范:
与…的关系
ToMany: Lazy
ToOne: Eager
但是,如果您使用的是较早版本的Hibernate,则默认情况下所有关系都带有Lazy
在这种情况下,如果您想尝试检索子关系,请使用JOIN FETCH
,例如:
Select m from MyMainEntity m JOIN FETCH m.nested;