2015-02-06 36 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));