2009-09-28 8 views
0

나는 비슷한 질문에 대한 해답을 해석하려고 시도했지만 제대로 작동하지 못했습니다.NHibernate를 사용하여 many-to-many 컬렉션을 쿼리하는 방법은 무엇입니까?

나는 활동 목록과 각 활동을 참가자 목록으로 가지고 있습니다. 여기에 매핑은 다음과 같습니다

var crit = ModelSession.Current.CreateCriteria<Activity>() 
    .AddOrder(Order.Desc("Timestamp")) 
    .SetFirstResult(start) 
    .SetMaxResults(count); 

지금 내가 특정 사람이 다른에 참여하는 활동 만 검색해야 : 나는 현재이 기준을 한 번에 활동에 열을 검색하고

<class name="Activity" lazy="false"> 
    <id name="ID"> 
     <generator class="guid" /> 
    </id> 
    <list name="Participants"> 
     <key column="Activity" /> 
     <index column="Ord" /> 
     <many-to-many column="Contact" class="Model.Contact" /> 
    </list> 
    <property name="Timestamp" /> 
    </class> 

    <class name="Contact" lazy="false"> 
    <id name="ID"> 
     <generator class="guid" /> 
    </id> 
    <property name="Name" /> 
    </class> 

단어 : Contact.Name은 '% some_name %'을 (를) 좋아합니다.

select * from Activity where ID in (select p.Activity from Participants p, 
Contact c where p.Contact=c.ID and c.Name like '%some_name%') 

어떤 생각이 어떻게 나 페이징 결과와 순서를 유지할 수있는 방법으로, HQL 또는 ICriteria으로,이 작업을 수행하는 : 원시 SQL에서 나는 아마 다음처럼 작성할 것? 많은 감사합니다!

답변

3

위의 ChssPly76 응답은 정확하지 않습니다. 이것은 단방향 관계이므로 프로젝트에 대한 연락처에 "활동"속성이 없지만 올바른 방향으로 나를 잡았습니다. 정답은 실제로는 훨씬 간단합니다 (자신의 대답 그래서 제대로 포맷 할 수 있습니다) : 원래의 질문에서 기준을 추가

crit.CreateCriteria("Participants") 
    .Add(Expression.Like("Name", like)); 

,이 "타임 스탬프의 지시 활동의 페이지를 반환 말한다, 참가자는이 이름을 가지고 있습니다. "

한 걸음 더 나아가서 나는 참가자의 목록에 검색 용어가 나타나거나 활동에 대한 설명이 실제로 필요한 모든 활동을 원했습니다. 이 경우 하위 쿼리가 필요합니다.

var subquery = DetachedCriteria.For<Activity>() 
    .SetProjection(Projections.Property("ID")) 
    .CreateCriteria("Participants") 
    .Add(Expression.Like("Name", search_term)); 

crit.Add(Expression.Or(
    Subqueries.PropertyIn("ID", subquery), 
    Expression.Like("Description", search_term)); 
1

당신은 당신의 기준에 적합한 조건을 추가해야합니다

crit.CreateAlias("Participants", "participant") 
.Add(Expression.Like("participant.Name", "%some_name%")); 

당신은 DetachedCriteria을 사용할 수 있습니다 업데이트가 참가자 조건을 지정하는 자세한 내용

에 대한 NHibernate에 문서의 Criteria associations 장을 참조하십시오 하위 쿼리로 사용 :

DetachedCriteria subquery = DetachedCriteria.For(typeof(Participant)) 
.SetProjection(Projections.Property("activity")) 
.Add(Expression.Like("name", "%some_name%")); 
crit.add(Subqueries.GeAll("ID", subquery)).List(); 
+0

어젯밤에 CreateAlias ​​()를 시도했을 때 맹세 했었을 수도 있습니다. 어제 밤에 중복 된 레코드가 다시 나왔지만 아무 문제가 없었습니다. 나를 똑바로 설정해 주셔서 고마워요! – starkos

+0

아니요, 아직 문제가 있습니다. 3 명의 참가자가있는 활동이있는 경우 결과 집합에 3 번 (각 참가자마다 한 번) 나타납니다. 따라서 조인은 각 페어링에 대한 레코드를 복제합니다. – starkos

+0

죄송합니다. 오해했습니다. 위의 업데이트를 살펴보십시오. – ChssPly76

관련 문제