【问题标题】:NHibernate: Denormalized SQL Query mapped to an objectNHibernate:映射到对象的非规范化 SQL 查询
【发布时间】:2013-03-13 17:37:18
【问题描述】:

我有这门课:

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

我想使用 NHibernate CreateSQLQuery 编写这个 SQL 查询

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

我如何进行这种转换:

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

它是否包含每个客户对象中的订单列表?

谢谢

【问题讨论】:

    标签: sql nhibernate denormalized


    【解决方案1】:

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

    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();
    

    希望这会有所帮助

    【讨论】:

      【解决方案2】:

      如果可以,请使用命名查询。

      <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>();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-10
        • 1970-01-01
        • 2013-02-15
        • 2013-02-05
        • 2017-05-09
        相关资源
        最近更新 更多