조건 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 제한이 적용됩니다. 쿼리가 실행되지만 데이터베이스 서버는 예외를 발생시킵니다.
버그입니까, 지원되지 않습니까, 잘못 했습니까?
이것은 버그라고 생각하지만 간단한 해결 방법을 발견했습니다. 나무 숲을 볼 수있는 첫 번째 사람에게 25 점을줍니다. 힌트 : 플레이어는 여러 주소에 연결될 수 있지만 해당 주소 중 하나만 우편 주소입니다. –