2010-01-13 3 views
6

GLCode가 포함 된 테이블 GL이 있습니다. 나는 고유 한 GLCode의 목록을 가져올 필요가 있지만 다른 모든 열을 얻는다. 다음 SQL은 내가 원하는 결과를 생성합니다.NHibernate : 열을 기반으로 다른 결과를 얻지 만 모든 열을 검색하십시오.

select * from GL where GLId in (select Min(GLId) from GL group by GLCode) 

Criteria API를 사용하여이를 수행 할 방법이 있습니까?

이 내 최고의 시도 : NHibernate에이 서브 쿼리의 결과 열에서 GLCode을 제외 할 수있는 방법이없는 경우에도

 var subQuery = DetachedCriteria.For<GL>(); 
     subQuery 
      .SetProjection(Projections.Property("GLCode"))     
      .SetResultTransformer(new DistinctRootEntityResultTransformer()); 

     return (List<GL>)currentSession 
      .CreateCriteria(typeof(GL)) 
      .Add(Subqueries.PropertyIn("GLCode", subQuery)) 
      .List<GL>(); 
+0

. 어떤 도움이 필요합니까? – Bipul

답변

3

, 작업을 수행하는 쿼리를 작성할 수 있습니다. IN 대신 correlated EXISTS 하위 쿼리를 사용하십시오.

select query.* 
from GL query 
where exists (
    select 
     min(subquery.GLId) AS GLId, 
     subquery.GLCode 
    from GL subquery 
    group by subquery.GLCode 
    having min(subquery.GLId) = query.GLId); 

그리고 여기에 NHibernate에 쿼리입니다 : 우리가 촬영하고있는 SQL이처럼 나 또한 같은 문제에 직면하고있다

var min = Projections.Min("GLId"); 

var subquery = DetachedCriteria.For<GL>("subquery") 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.GroupProperty("GLCode"), "GLCode") 
     .Add(min, "GLId")) 
    .Add(Restrictions.EqProperty(min, "query.GLId")); 

return session.CreateCriteria<GL>("query") 
    .Add(Subqueries.Exists(subquery)) 
    .List<GL>(); 
+0

정말 nhibernate 대답 앞의 SQL 예제를 좋아해. – ctrlplusb

관련 문제