2009-05-13 5 views
2

NHibernate의 ICriteria API를 사용하여 표현해야하는 SQL 쿼리가 있습니다.NHibernate - ICriteria를 사용하여 서브 쿼리에 참여하기

SELECT u.Id as Id, 
    u.Login as Login, 
    u.FirstName as FirstName, 
    u.LastName as LastName, 
    gm.UserGroupId_FK as UserGroupId, 
    inner.Data1, 
    inner.Data2, 
    inner.Data3 
    FROM dbo.User u inner join 
    dbo.GroupMember gm on u.Id = gm.UserAnchorId_FK 
    left join 
    (
     SELECT 
     di.UserAnchorId_FK, 
     sum(di.Data1) as Data1, 
     sum(di.Data2) as Data2, 
     sum(di.Data3) as Data3 
     FROM 
     dbo.DailyInfo di 
     WHERE di.Date between '2009-04-01' and '2009-06-01' 
     GROUP BY di.UserAnchorId_FK 
    ) inner ON inner.UserAnchorId_FK = u.Id 
    WHERE gm.UserGroupId_FK = 195 

시도는 지금까지 매핑 '사용자'와 'DailyInfo'클래스 (내 개체)와 DailyInfo은 사용자 개체의 속성을 객체 만들기를 포함했다. 그러나, 그들 사이의 외래 키 관계를 매핑하는 방법 그러나 나는이 하위 쿼리 대신에 조인 왼쪽 필요가 웹

<one-to-one></one-to-one> 

<one-to-many></one-to-many> 

<generator class="foreign"><param name="property">Id</param></generator> (!) 

솔루션은 WHERE 절에서 하위 쿼리와 함께 할 일반적으로 즉, 여전히 신비 조인하지 않는 행에 NULL 값이 리턴되는지 확인하십시오.

외부 쿼리에 대한 기준을 사용해야한다고 생각하고 하위 쿼리를 나타내려면 DetachedCriteria와 '조인'을 형성하고 있습니까? 나는 순간에 완전히 확실하지 않다, 나머지으로

<!-- User mapping --> 
<bag name="DailyInfos" inverse="true"> 
    <key column="UserAnchorId_FK" /> 
    <one-to-many class="Namespace.To.DailyInfo, Namespace" /> 
</bag> 

<!-- DailyInfo mapping --> 
<many-to-one name="User" column="UserAnchorId_FK" /> 

:

답변

0

는 지금까지의 관계를 매핑, 그것은 당신이 사용자 및 DailyInfo 사이에 일대 다 관계를 가지고있는 것처럼 들린다. 당신이 UserGroup 사이에 GroupMember 테이블을 통해 many-to-many를 가질 수있는 것처럼 들리므로 복잡한 요소 일 수 있습니다. 조건에 .CreateCriteria("Association path", jointype)을 수행하면 지정된 조인 유형을 사용하여 하위 기준을 만들 수 있습니다. 당신의 클래스/테이블 관계의 요약을 게시하는 것이 도움이 될 수 있습니다.

1

같은 문제는 내가가 발생하고 난 기준에 의해 생성 된

쿼리

SELECT u.Id as Id, 
u.Login as Login, 
u.FirstName as FirstName, 
u.LastName as LastName, 
gm.UserGroupId_FK as UserGroupId, 
inner.Data1, 
inner.Data2, 
inner.Data3 
FROM dbo.User u inner join 
dbo.GroupMember gm on u.Id = gm.UserAnchorId_FK 
InnerJoin inner ON inner.UserAnchorId_FK = u.Id 
WHERE gm.UserGroupId_FK = 195 

여기 InnerJoin 1-1을 가진 더미 테이블 내가 인터셉터와 함께 해킹을 한 모든 solutions.So을하지 않았다 사용자와의 관계. 내부는 인터셉터는 여러 테이블 값에 대한 쿼리

public interface CustomInterceptor : IInterceptor, EmptyInterceptor 
{  
SqlString IInterceptor.OnPrepareStatement(SqlString sql) 
{ 
    string query = sql.ToString(); 
    if (query.Contains("InnerJoin ")) 
    { 
     sql = sql.Replace("InnerJoin ", "(select [vals] form dbo.DailyInfo [where conditions])"); 
    } 
    return sql; 
} 
} 

을 편집 할 수 있습니다 이제

DetachedCriteria forUser = DetachedCriteria.For<User>(); 
forUser.CreateCriteria("InnerJoin"); 

사용자 및 InnerJoin을 위해 서브 쿼리를

기준 가입의 InnerJoin에서 열 반환 값입니다 조인 된 하위 쿼리를 포함하여 NHibernate DTO를 사용할 수 있습니다. 그리고 세션은 다음과 같습니다.

CustomInterceptor custonInterceptor=new CustomInterceptor(); 

sessionFactory.OpenSession(custonInterceptor); 

마지막 쿼리는 정확히 원하는 것과 같습니다.