2011-07-01 5 views
0

조건 API에 대한 Hibernate 3 introduced the With clause. 나는 다 대다 관계에 참여를 제한하기 위해 그것을 사용하려고하고 Hibernate는 올바른 테이블보다는 연결 테이블에 추가 조인 제한을 적용합니다.기준 API 다 대 다 관계의 With 절

나는 Player와 Address 사이에 다 대다 관계가 있으며, Address.IsMailingAddress를 제한하여 플레이어와 그 우편 주소를 반환하고자합니다. Where 절의 IsMailingAddress 제한은 우편 주소가없는 레코드 (또는 주소가 전혀없는 레코드)를 반환하지 않으므로 조인에서이를 제한해야합니다. 아래의 코드는 단순화되어 있으므로 HQL을 사용할 수 없습니다.

은 쿼리 :

SELECT this_.PlayerId as y0_ 
FROM dbo.VPlayerExisting this_ 
     left outer join dbo.LinkPlayAddr addresses3_ 
     on this_.PlayerId = addresses3_.PlayerId 
      and (ad1_.MailingAddressFlag = 1 /* @p0 */) 
     left outer join dbo.VAddress ad1_ 
     on addresses3_.AddressId = ad1_.AddressId 
      and (ad1_.MailingAddressFlag = 'Anonymous' /* @p1 */) 
WHERE this_.Name_Last = @p2 

MailingAddressFlag (IsMailingAddress 매핑 된 열) 그렇지 않은 경우 대다 연결 테이블에 제한 :

var target = session.CreateCriteria<Player>() 
    .SetProjection(Projections.Property("PlayerId")) 
    .CreateAlias("Addresses", "ad", JoinType.LeftOuterJoin, Restrictions.Eq("ad.IsMailingAddress", true)) 
    .Add(Restrictions.Eq("LastName", "Anonymous")) 
    .List(); 

는 SQL을 생성 Address 테이블에 대한 조인에 LastName 제한이 적용됩니다. 쿼리가 실행되지만 데이터베이스 서버는 예외를 발생시킵니다.

버그입니까, 지원되지 않습니까, 잘못 했습니까?

+0

이것은 버그라고 생각하지만 간단한 해결 방법을 발견했습니다. 나무 숲을 볼 수있는 첫 번째 사람에게 25 점을줍니다. 힌트 : 플레이어는 여러 주소에 연결될 수 있지만 해당 주소 중 하나만 우편 주소입니다. –

답변

1
var target = session.CreateCriteria<Player>() 
    .CreateAlias("Addresses", "ad", JoinType.InnerJoin) 
    .Add(Restrictions.Eq("LastName", "Anonymous")) 
    .Add(Restrictions.Eq("ad.IsMailingAddress",true)) 
    .List(); 

IsMailingAddress에 대한 제한 사항이있는 메일 주소로 내부 조인 만하면됩니까?

MailingAddress와 주소가 같고 해당 주소가있는 플레이어 (성이 "익명"인)를 IsMailingAddress로 다시 가져와야합니다.

+0

주소가 없거나 IsMailingAddress가 설정된 주소가없는 경우 플레이어를 반환하지 않습니다. 첫 번째 문제 (행 없음)는 왼쪽 조인으로 쉽게 해결할 수 있으며 두 번째 문제는 더 어렵습니다. 목표는 메일 주소가있는 플레이어를 반환하고, 그렇지 않으면 null 주소가있는 플레이어를 반환하는 것입니다. –

+0

플레이어는 우편 주소로 표시되지 않은 단일 주소 만 가질 수 있습니까? –

+0

해결 방법을 이해할 수 있도록 자신의 질문에 답변 할 수있는 기회가 언제 있습니까? –

0

해결책은 다음과 같습니다. IsMailingAddress가 설정된 주소가 하나만 있어야하므로 내부 조인을 사용하거나 사용하지 않으면 조인이 성공할 수 있습니다.

var target = session.CreateCriteria<Player>() 
    .SetProjection(Projections.Property("PlayerId")) 
    .CreateAlias("Addresses", "ad", JoinType.InnerJoin) 
    .Add(RestrictionsOr(Restrictions.Eq("ad.IsMailingAddress", true), Restrictions.IsNull("ad.AddressId"))) 
    .Add(Restrictions.Eq("LastName", "Anonymous")) 
    .List(); 
+0

어떤 DB를 사용하고 있습니까? SQL을 게시 할 수 있습니까? –

관련 문제