2015-02-06 10 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 B의을 반환

그래서 경우에도 3 자녀 B가 만 두 기준을 충족합니다.

hibernate의 생성 된 SQL 문을 checkin하면 알 수 있습니다. 괜찮

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

, 이 검색의 모든 기관은 기준을 충족하지만, 다음 두 번째 쿼리가 B에게 개체를 얻을 발생합니다. 선택은 내가 한 번이 문제를했다,하지만 내 쿼리가 CriteriaBuilder를 사용 did't, 그리고 그것은를 FETCH JOIN 를 사용하여 해결되었다

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

해야하기 때문에 잘못

select * from b where aid = ? 

, 그러나 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));