2


我们有一个 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 记录,所以我先进行两步查询,我使用分页使用setMaxResultssetFirstResult然后使用获取的对象的 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(没有问题)。

谢谢,
稻田

4

0 回答 0