我们有一个 A 类,它有两层嵌套关联,如下所示:
@Entity
@NamedQuery("select a from A JOIN FETCH b");
public class A {
@OneToOne(cascade = CascadeType.ALL, optional = true)
@JoinColumn(name = "XXX")
private B b;
}
@Entity
public class B {
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "XXX")
@Fetch(FetchMode.SUBSELECT)
private List<B> details = new ArrayList<>();
}
@Entity
public class C {
...
}
现在对于报告查询,我们正在获取所有 A 记录,所以我先进行两步查询,我使用分页使用setMaxResults
,setFirstResult
然后使用获取的对象的 ID 来触发第二个查询,其中我想要分页对象的整个对象图身份证。现在,由于 Hibernate 似乎不允许对 OneToOne 进行 SUBSELECT,以获取 B 的记录,所以我求助于 JOIN FETCH(如果有人知道该怎么做,我更喜欢这里的 SUBSELECT,请分享)但是表 C 要大得多,我想要使用 SUBSELECT 而不是加入。如果没有 SUBSELECT,它会触发许多查询,但会使用我指定并传递的单个 IN 参数。但是使用 SUBSELECT,似乎再次期待相同的 IN 参数,
就像在真正的 SQL 查询中一样
select a.id from a limit ? (fetch IDs by pagination)
select a.*, b.* from a inner join b on a.b_id=b.id where a.id in (?, ?)
select c.* from c where c.id in (select c_id from b where b.id in (Select b_id from a where id in (?, ?))) - (this is fired by the SUBSELECT, how to resend same named parameter say :ids a second time for this scenario?)
我的代码是这样的:
List<Long> ids = fetchIds(startPos, maxRecords);
TypedQuery<A> query =em.createNamedQuery(A.NAMED_QUERY, A.class);
query.setParameter("ids", ids);
假设fetchIds
在第一步中通过分页获取 ID(没有问题)。
谢谢,
稻田