2010-07-10 6 views
4

이벤트에는 일대 다 메타 데이터 엔터티 EventData가있는 최대 절전 모드 엔터티가 있습니다.조건을 사용하여 최대 절전 모드 일대 다 검색

주어진 다음의 이벤트 :

에서 EventId : 1
EventHash 다음 EventDatas 브로콜리

:

EventDataId : 1
에서 EventId : 1
필드 : 태그
내용 : tagme

EventD ataId : 2 개
에서 EventId : 1 개
필드 : 태그
내용 : anotherTag

어떻게 태그 "anotherTag"와 "tagme"BOTH이있는 이벤트를 검색 기준 쿼리를 만들려면 어떻게해야합니까? SQL, 나는 검색되는 각 태그에 한 번 EVENT_DATA 테이블을 조인 것,하지만 난에만 Event.EventData 관계에 대해 하나의 별칭을 만들 보일 수있다 즉

int inc = 0; 

Conjunction junc = Restrictions.conjunction(); 

for (String tag : tags) { 
    crit.createAlias("e.EventData", "ed"+inc); 
    junc.add(
     Restrictions.and(
      Restrictions.eq("ed"+inc+".field", "tag"), 
      Restrictions.eq("ed"+inc+".content", tag) 
     ) 
    ); 
    inc++; 
} 

작동하지 않습니다; 슬프게도, 데이터베이스 필드가 동시에 두 개의 서로 다른 값을 가질 수 없습니다,

((ed3_.field='tag' and ed3_.content='anotherTag') and (ed3_.field='tag' and ed3_.content='tagme')) 

과 : 절이로 끝나는 때문에 duplicate association path: Event.EventData

마찬가지로, 정상 접속사가 작동하지 않습니다.

어떻게 해결할 수 있을지 또는 HQL로 되돌릴 수있는 유일한 방법은 무엇입니까?

답변

4
List fields = new ArrayList(1); 
fields.add("tag") 

List contents = new ArrayList(tags.size()); 
for (String tag : tags) { 
    contents.add(tag); 
} 

session.createCriteria(Event.class); 
criteria.createCriteria("eventDatas").add(Restrictions.and(Restrictions.in("field", fields), Restrictions.in("content", contents))); 

/필드의 크기는 항상 하나라면, 당신은 Restrictions.eq을 사용할 수 있습니다 * ("필드", "태그") 또한 */

+0

최고의, 감사합니다! – Martin

관련 문제