2010-01-27 88 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給定類的構造函數SELECT子句:

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

此示例要求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>(); 

爲了使這些示例時,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類型的實體。

但是,從您給出的示例看來,您好像要從相同的投影查詢中返回兩種類型的實體。使用這些方法可能很難實現。我做了幾個快速測試,沒有任何運氣。

更新:

可以使用AliasToBean結果變壓器的標準API以及與HQL。變換器以相同的方式使用,但使用Criteria,投影查詢看起來有點不同。以下是使用條件查詢的示例:

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使用標準API。 作爲一個(臨時)解決方法,我使用實體A的查詢並迫切地加載實體B. – Starfield 2010-01-28 16:06:44

+0

很高興我能幫上忙! AliasToBean變換器也適用於Criteria API,我用一個例子更新了答案。 – 2010-01-28 17:31:10