2015-02-06 66 views
0

我有一个与另一个实体具有一对多关系的实体。说jpa 2 CriteriaQuery不区分子实体

1A -> 1.*B 

我写了这个查询。

CriteriaBuilder cb = super.getEntityManager().getCriteriaBuilder(); 
CriteriaQuery<A> select = cb.createQuery(A.class); 
Root<A> from = select.from(A.class); 
Join<A, B> joinB = from.<A, B>join("b"); 
select.select(from); 
select.where(cb.between(joinB.<Date>get("date"), dateA, dateB)); 

问题:该查询返回所有的子实体,而不是只有那些符合之间的约束。

所以即使一个有3个孩子,只有两个符合标准,查询总是返回3 B的

签入hibernate的生成的sql,我可以看到这一点。

select a from A where a_id = ? and b_date b.date between ? and ? 

这是很好的,所有一个检索到的实体符合标准,但随后第二个查询被抛出,以获得实体。

select * from b where aid = ? 

这是错误的,因为选择应该是

select * from b where aid = ? and b.date between ? and ? 

我有这个问题一次,但我查询我以前不使用CriteriaBuilder,它是通过使用连接抓取解决,但CriteriaQuery我一直无法解决它。

回答

0

好了,该解决方案很容易(在末尾)我不得不添加铸从加入,这是最终的查询。

CriteriaBuilder cb = super.getEntityManager().getCriteriaBuilder(); 
CriteriaQuery<A> select = cb.createQuery(A.class); 
Root<A> from = select.from(A.class); 
Join<A, B> joinB = (Join<A, B>) from.<A, B>fetch("b");//CAST. 
select.select(from); 
select.where(cb.between(joinB.<Date>get("date"), dateA, dateB));