Hibernate subselect提取关联,如何传递参数?

时间:2015-09-02 11:08:59

标签: hibernate java-8 named-query jpa-2.1 sql-subselect


   我们有一个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来触发第二个查询,我想要分页对象ID的整个对象图。    现在由于Hibernate似乎不允许为OneToOne提供SUBSELECT,为了获取B的记录,我使用了JOIN FETCH(如果有人知道怎么做,请在这里更喜欢SUBSELECT,请分享)但是表C要大得多,我想要使用SUBSELECT而不是join。如果没有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(没有问题)。

谢谢,
稻谷

0 个答案:

没有答案