2013-03-13 60 views
1

我有这个类:的NHibernate:规格化SQL查询映射到一个对象

public Customer 
{ 
    public int CustomerId {get;set;} 
    .... 
    public List<Order> OrderList {get;set;} 
} 

我想写使用NHibernate CreateSQLQuery

SELECT C.CustomerId, .... O.OrderId, O.OrderDate, O.OrderTotal..... 
FROM Customers C 
    LEFT OUTER JOIN Orders O ON C.CustomerID = O.CustomerID 

如何使这种转变工作这个SQL查询:

.SetResultTransformer(Transformers.AliasToBean<Customer>()) 

并让它包含每个Customer对象内的Orders列表?

感谢

回答

0

假设你的结果映射到你的实体的属性名称的所有列名,您可以尝试:

var myQuery = @"SELECT C.CustomerId, .... O.OrderId, O.OrderDate, O.OrderTotal..... 
        FROM Customers C 
        LEFT OUTER JOIN Orders O ON C.CustomerID = O.CustomerID"; 

myNHSession.CreateSQLQuery(myQuery) 
      .AddEntity("C",typeof(Customer)) 
      .AddJoin("O","C.OrderList") 
      .List(); 

希望这将有助于命名查询

0

使用,如果你能。

<sql-query name="myQuery"> 
    <return alias="c" class="Customer" /> 
    <return-join alias="o" property="c.Orders" /> 
    <![CDATA[ 
    SELECT {c.*}, {o.*} FROM Customers c LEFT OUTER JOIN Orders o ON c.CustomerId = o.CustomerId 
    ]]> 
</sql-query> 

{c.*}{o.*}由NHibernate的理解和在会话建立时间的实际列替换。另一个优点是可以在应用程序启动时预编译这些查询。

var results = session.GetNamedQuery("myQuery").List<Customer>(); 
相关问题