2011-12-28 3 views
2

나는 Hibernate Criteria에 익숙하지 않고,이 질문이 너무 단순하다면 사과한다. 그러나 어떤 도움을 주시면 감사하겠습니다!Hibernate Criteria 컬렉션 프로퍼티 (subquery?)

CD와 트랙의 두 엔티티가 있습니다. 각 CD에는 트랙 개체 모음이 있습니다. 각 트랙에는 "title"이라는 String 필드가 있습니다. 이제 Hibernate Criteria를 사용하여 "title"이 설정된 값을 가진 트랙이있는 모든 CD를 검색하려고합니다. 내가 지금까지 가지고있는 것은 :

//session handling 
Criteria cdCriteria = session.createCriteria(CD.class); 
DetachedCriteria trackCriteria = DetachedCriteria.forClass(Track.class); 
trackCriteria.add(Restrictions.eq("title", "SomeTitle")); 
trackCriteria.setProjection(Projections.property("title")); 
criteria.add(Subqueries.exists(trackCriteria)); 
List<CD> cds = criteria.list(); 

이것은 트랙 제목에 관계없이 모든 CD를 반환합니다. 누구 제안이 있습니까?

미리 감사드립니다.

답변

9

당신은 솔루션에 매우 가깝습니다. 당신은 단지 CD의 트랙 수 있어야 트랙보다라는 제한을 놓친 :

Criteria cdCriteria = session.createCriteria(CD.class, "cd"); 
DetachedCriteria trackCriteria = DetachedCriteria.forClass(Track.class, "track"); 
trackCriteria.add(Restrictions.eq("track.title", "SomeTitle")); 
trackCriteria.add(Restrictions.propertyEq("track.cd.id", "cd.id")); 
trackCriteria.setProjection(Projections.property("track.title")); 
criteria.add(Subqueries.exists(trackCriteria)); 
List<CD> cds = criteria.list(); 

또는

Criteria cdCriteria = session.createCriteria(CD.class, "cd"); 
DetachedCriteria trackCriteria = DetachedCriteria.forClass(Track.class, "track"); 
trackCriteria.add(Restrictions.eq("track.title", "SomeTitle")); 
trackCriteria.createAlias("track.cd", "trackCd"); 
trackCriteria.add(Restrictions.propertyEq("trackCd.id", "cd.id")); 
trackCriteria.setProjection(Projections.property("track.title")); 
criteria.add(Subqueries.exists(trackCriteria)); 
List<CD> cds = criteria.list(); 

당신은 또한 하위 쿼리를 방지하고 단순히 조인을 사용할 수

Criteria cdCriteria = session.createCriteria(CD.class, "cd"); 
criteria.createAlias("cd.tracks", "track"); 
criteria.add(Restrictions.eq("track.title", "someTitle")); 
criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE); 
+0

고마워요! 나는 당신의 마지막 해결책을 조인과 함께 할 수 있었다. 다른 두 가지는 매핑 예외로 실패합니다. Unknown entity : null "track.cd"로 인한 것입니다. "cd"는 Track의 필드가 아니기 때문입니다. 관계는 CD에서 트랙까지의 방향입니다. 아니면 내가 여기 잘못 생각하는거야? – user1119371

+0

아니, 네가 맞아. 연관성이 양방향이고 트랙에 cd 필드가 있다고 가정했습니다. –

+0

하위 쿼리를 사용하여 해결할 수 없습니까? 배치가 양방향이 아니기 때문에 조인을 사용하는 것이 유일한 방법일까요? – user1119371

0

실제로 조인없이이 작업을 수행 할 수 있습니다. 별칭의 문자열 값 대신 cdCriteria.getAlias ​​()를 사용하면됩니다. 따라서 핵심 행은 다음과 같습니다.

trackCriteria.add(Restrictions.propertyEq("trackCd.id", cdCriteria.getAlias() + ".id")); 
+1

이것은 사용자가 정의한 것이 아니라 최대 절전 모드 내부 별명을 사용합니다. –

관련 문제