2013-05-07 2 views
0

내 응용 프로그램에는 두 개의 엔티티 클래스 User, Activity이 있습니다.AND, OR 연산자를 사용하는 Hibernate Criteria 질의

활동 클래스는 다음과 같습니다

public class Activity{ 
private Set<User> users; 
private Set<User> activityManagers; 
} 

및 클래스 사용자는 다음과 같습니다

public class User{ 
private String userName; 
} 

가 지금은 최대 절전 모드 기준을 사용하여 검색 할 모든 Activities 특정 값에 Userusername 설정을 가지고에서 속성 users 또는 managers 또는 둘 다 나는이 시도했다 : 그것은 내가 잘못했을 제대로 어디에요 작동하지 않습니다

Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(Activity.class, "act"); 
criteria.createAlias("act.activityManagers", "manager"); 
criteria.createAlias("act.users", "user"); 
criteria.add(Restrictions.disjunction().add(Restrictions.eq("manager.username", userName)).add(Restrictions.eq("user.username", userName))); 
criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE); 

모르겠어요. 누구든지 나를 도울 수 있습니까? 감사합니다

UPDATE-1 한다고 가정 내가 5 Activity

First Activity:users[aaa,bbb,cccc],managers[ddddd]. 
Second Activity:users[userName,dddd],managers[userName,xxx,gggg]. 
Third Activity:users[userName,vvvvv,bbbb],managers[sss,cccc,tttt]. 
Fourth Activity:users[aaa,ffff,jjjj],managers[userName,uuuu,iiiii]. 
Fifth Activity:users[dddd,ffff],managers[jjjjj,iiii]. 

결과가 두 번째해야합니다 가지고, 세 번째, 네 번째 활동. 그러나 나는 단지 활동을 고갈시키고 있습니다.

+1

어떻게 작동하지 않습니까? – Thihara

+0

@Thihara는 예상 답변을 제공하지 않습니다. – Diganta

+1

@Diganta 무엇이 입력이고, 예상되는 출력은 무엇이며, 실제 출력은 무엇입니까? 우리가 당신을 도울 수 있도록 도와주세요. –

답변

0

코드 단위 테스트를 해 보셨습니까?

귀하의 활동 등급에 managers에 비해 귀하의 기준에 activityManagers을 사용하고 있습니다.

criteria.createAlias("act.activityManagers", "manager");

어쩌면 당신이 결과에 2 managers이없는 이유가 될 수 있을까?

+0

내 질문을 업데이트했습니다. 나는 지금 명확한가? – Diganta

+0

내가 응답 한 것처럼 '관리자'로 기준에서 'activityManagers'를 바꾸려고 시도한 적이 있습니까? – DrSeb

+0

답장을 보내 주셔서 감사합니다. @DrSeb : 잘못 입력 했으므로 죄송합니다. 속성 이름은'managersManagers'가 아니고 관리자가 아니므로 질문을 업데이트했습니다. – Diganta

0

Hibernate는 당신이 원하는 것을 정확하게하고 있지만, 아마도 당신이 원하는 쿼리를 얻지 못할 것입니다.

당신의 hibernate.cfg 파일이 추가 :

<property name="hibernate.show_sql">true</property> 

그런 다음 응용 프로그램에서 쿼리를 실행하고 콘솔에서 생성 된 쿼리를 복사하여 SQL의 intarface에서 직접하려고하면 무슨 발견 할 것이다 생성되고 당신이 정말로 원했던 것.