2009-08-24 2 views
4

ICriteria를 사용하여 조인 조건이있는 쿼리를 만들려고합니다. 나는 그것은 내가 원하지 않는 아래의 SQL을 생성합니다nHibernate ICriteria Join Condition

m_ClientRepository.QueryAlias("client") 
    .CreateCriteria("client.Contacts", "c", JoinType.LeftOuterJoin) 
    .Add(Restrictions.Eq("c.ContactType", ContactType.Email)); 

같은 기준을 사용하는 경우 나 생성하기 위해 애 쓰고 SQL이

SELECT c.ClientID 
FROM Client c 
LEFT OUTER JOIN ClientContact t on c.ClientID = t.ClientID AND 
t.ContactType = 'Email' 

처럼 보일 것입니다.

SELECT c.ClientID 
FROM Client c 
LEFT OUTER JOIN ClientContact t on c.ClientID = t.ClientID 
WHERE t.ContactType = 'Email' 

ICriteria를 사용할 수없는 경우 ICriteria 또는 HQL과 함께이 작업을 수행 할 수 있습니까?

편집 : 지금 사용하고있는 nHibernate 2.1을 발견했습니다. allow this입니다. ICriteria에 대한 확신이 없지만 이것이 나의 취향이다.

+0

내가 찾고있는 기준에서 정확히 같은 것. 우리는 with 표현이 필요합니다. – madcapnmckay

+0

SQL을 많이 사용하지는 않지만 두 번째 옵션보다 첫 번째 옵션을 원하는 이유는 무엇입니까? 동일한 결과를 제공하지 않습니까? – pythonandchips

+0

안녕하세요 콜린, 그들은 같은 결과를주지 않습니다. – Craig

답변

0

ISQLQuery와 함께 IQuery를 사용할 수 있습니다. 그것은 Criteria 메커니즘은 아니지만 도움이 될 것입니다. 당신이 올바른 join을 형성 할 수있는 방법을 찾을 수없는 경우 당신은 NHibernate에 2

0
from s in Session.Linq<Client> left join cc in c.Contacts 
     on 
     new { c.ClientID , cc.ClientID } 
     equals 
     new { cc.ContactType, "Email" } 
     select c.ClientId; 

희망 작동, 당신은 간단한 트릭을 할 수 있습니다 : 당신의 제한이 WHERE t.ContactType = 'Email' OR t.ClientID IS NULL 수 있도록 - 희망, 그것은 NHibernate로 가능하다.

1

를 사용하는 경우이

+0

이 해결 방법을 사용하려면 내부 조인으로 조인을 변경해야합니다. –

+0

@Jamie No. 이제 LEFT JOIN입니다. 충분합니다. –

3

나는 이것을하지 않을 것이다. 어쨌든 왼쪽 외부 조인은 NH로드 클라이언트를 허용합니다. 전자 메일 연락처의 필터는 연락처 컬렉션을 초기화하고 모든 것을로드 할 때까지 전자 메일 연락처 만로드합니다.

전자 메일 연락처 만로드하는 경우 메모리에있는 불완전한 개체가 종료됩니다. 이는 대개 같은 트랜잭션에서 데이터를 변경하는 경우에는 좋지 않습니다.

나는 귀하의 상황에서 직접 전자 메일 주소록을로드하고 해당 주소록에서 고객에게 문의하려고합니다.

session.CreateCriteria(typeof(Contact)) 
    .Add(Restrictions.Eq("c.ContactType", ContactType.Email));