2010-06-04 2 views
1

현재 NHiberate를 .NET 2.0 및 NHibernate 2.2와 함께 DAL로 사용하는 프로젝트에서 작업 중입니다.NHibernate 반환 값

오늘 나는 내가 원하는 것을 얻기 위해 많은 엔티티들/컬렉션들에 가입해야만했다. 괜찮습니다.

내가 얻은 것은 쿼리가 특정 엔터티 유형의 개체 목록을 반환하지 않고 결과가 다른 엔터티의 다양한 속성을 포함하기를 원했기 때문입니다.

다음 쿼리는 내가하는 일이 아니지만 내가 여기서 말하는 쿼리 종류입니다.

select order.id, sum(price.amount), count(item) 
from Order as order 
    join order.lineItems as item 
    join item.product as product, 
    Catalog as catalog 
    join catalog.prices as price 
where order.paid = false 
    and order.customer = :customer 
    and price.product = product 
    and catalog.effectiveDate < sysdate 
    and catalog.effectiveDate >= all (
     select cat.effectiveDate 
     from Catalog as cat 
     where cat.effectiveDate < sysdate 
    ) 
group by order 
having sum(price.amount) > :minAmount 
order by sum(price.amount) desc 

내 질문에 어떤 결과가 반환 될까요? 그것은 확실히 Order 유형이 아니며 LineItem 유형도 아닙니다.

도움 주셔서 감사합니다.

요한은

답변

2

당신은 항상 데이터를 반환하는 객체 []의 목록을 사용할 수 있으며, 그것은 잘 작동합니다.

+0

Fahad, 좀 더 구체적으로 설명해 주시면 감사하겠습니다. session.CreateQuery()에는 사용해야하는 것으로 생각되는 list() 메서드가 있습니다. list() 메서드를 사용하여 select 문에있는 모든 항목을 포함 할 객체 배열을 반환하는 방법은 무엇입니까? 감사합니다. . – John

+0

IQuery에는 일반적인 목록 방법이 있습니다. IQUERY objQuery = mySession.CreateQuery (....... VAR 결과를 다음과 같이 호출 할 수 = objQuery.List (); – Fahad

+0

파하드, 난 당신이 작업을 수행 무엇을 제안 위의 벤에 대답한다. List ()을 호출하기 전에 SetResultTransformer (new DistinctRootEntityResultTransformer())를 사용했기 때문에 이전에 작동하지 않았습니다. 감사합니다. – John

1

이것은 프로젝션이라고 불리며 다양한 테이블의 행 (또는 단일 테이블의 집계/요약 데이터)을 포함하는 명시 적 SELECT 절을 지정할 때마다 발생합니다.

이 같은 데이터의 이러한 행을 저장하는 익명의 개체를 만들 수 있습니다 LINQ를 사용하여 :

var crunchies = (from foo in bar 
       where foo.baz == quux 
       select new { foo.corge, foo.grault }).ToList(); 

는 그런 다음 행을 & 열을 꺼내 예를 들어 crunchies[0].corge을 할 수 있습니다.

당신이 NHibernate.Linq를 사용하고 있다면 이것은 "효과가있을 것"입니다.

HQL 또는 Criteria API를 사용하는 경우 Fahad에서 언급 한 기능이 작동합니다. 결과적으로 List<object[]>이 생기고 배열 색인은 select 절에서 리턴 한 컬럼의 순서를 참조합니다.

+0

Ben, LINQ를 지원하는 .NET 버전을 사용하고 싶습니다. 결과를 얻으려면 HQL에 응답해야합니다. 파하드 (Fahad)가 제안한 이유는 이전에 작동하지 않은 이유는 L을 호출하기 전에 SetResultTransformer (새 DistinctRootEntityResultTransformer())를 추가했기 때문입니다. ist John

+0

모든 것이 해결 되었습니까? –