2010-01-27 2 views
3

투영 쿼리를 사용하여 엔터티를 반환 할 수 있습니까?투영 쿼리를 통한 엔터티 반환

SQL 쿼리를 사용하여 성공적으로 수행했지만 (아래 참조) 프로젝션 쿼리로 수행하는 방법을 찾을 수 없습니다.

Dim sql As String = "SELECT {a.*}, {b.*} FROM a LEFT OUTER JOIN b ON a.pk = b.fk") 

' Convert SQL results into entities {a} and {b} 
Dim query As IQuery = session.CreateSQLQuery(sql) _ 
            .AddEntity("a", GetType(a)) _ 
            .AddEntity("b", GetType(b)) 

Return query.List() 

답변

6

예, 프로젝션 쿼리에서 엔티티를 반환 할 수 있습니다. 당신은 HQL 쿼리를 사용하는 경우

을 선택할 절을 HQL에서 주어진 클래스의 생성자를 지정할 수 있습니다

IList<Foo> foos = session.CreateQuery(
    "select new Foo(f.Name, f.Value) from Foo f") 
    .List<Foo>(); 

이 예는 푸 클래스에서 사용하는 서명을 맞는 생성자가 있어야합니다 HQL 쿼리. 예 :

AliasToBean ResultTransformer를 사용하면 쿼리에서 반환 된 값을 지정된 유형의 속성에 자동 매핑 할 수 있습니다. 이 방식을 사용하려면 쿼리에 사용 된 별칭이 지정된 유형의 속성에 직접 매핑되어야합니다. 예를 들어 :

IList<Foo> foos = session.CreateQuery(
    "select f.Name as Name, f.Value as Value from Foo f") 
    .SetResultTransformer(Transformers.AliasToBean<Foo>()) 
    .List<Foo>(); 

는 푸 클래스는 다음과 같이 수, 이러한 예 작동하게하려면

public class Foo 
{ 
    public Foo() { } 

    public Foo(string name, double value) 
    { 
     Name = name; 
     Value = value; 
    } 

    public virtual string Name { get; set; } 
    public virtual double Value { get; set; } 
} 

클래스는 위의 첫 번째 HQL 예에 ​​유효한 생성자가 포함되어 있습니다. 또한 두 번째 HQL 쿼리에 사용 된 별칭과 일치하는 공용 속성을 정의하므로 AliasToBean 변환기가 쿼리 결과에서 Foo 유형의 엔터티를 채울 수 있습니다.

그러나 예를 들어, 같은 투영 쿼리에서 두 가지 유형의 엔터티를 반환하려는 것처럼 보입니다. 이러한 방법을 사용하면 달성하기가 더 어려울 수 있습니다. 나는 행운이없이 몇 가지 빠른 테스트를했다.

업데이트 :

당신은 기준 API를뿐만 아니라 HQL로 AliasToBean 결과 변압기를 사용할 수 있습니다. 변환기는 같은 방식으로 사용되지만 투영 쿼리는 기준을 사용하여 조금 다르게 보입니다. 다음은 조건 쿼리를 사용하는 예입니다.

IList<Foo> foos = session.CreateCriteria<Foo>() 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.Property("Name"), "Name") 
     .Add(Projections.Property("Value"), "Value")) 
    .SetResultTransformer(Transformers.AliasToBean<Foo>()) 
    .List<Foo>(); 
+0

감사합니다! 이상적으로 나는 HQL보다 criteria API를 사용하고 싶습니다. 임시 해결책으로 엔티티 A의 쿼리를 사용하고 열심히 엔티티 B를로드하고 있습니다. – Starfield

+0

기꺼이 도와 드리겠습니다! AliasToBean 트랜스 포머는 Criteria API와 함께 작동합니다. 예를 들어 대답을 업데이트했습니다. –