重载协会/ NHibernate的相关收藏(Reload association/related c

2019-09-03 03:03发布

如果我有订单实体订单明细的清单,我可以很容易地渴望负载使用NHibernateUtil.Initialize(Order.Details)订的细节。 所以很明显NHibernate的有所有的信息来生成SQL语句。 但我怎么查询数据库只是细节,而无需手动创建标准(类似CreateSourceQuery实体框架)? 有什么样NHibernateUtil.GetList(Order.Details)?

更新:使用Darin的答案这是我终于结束了。 这是通用的,我可以在实体基类中实现它

Dim entity as EntityBase
Dim queryString = String.Format("select entityAlias.{1} from {0} entityAlias where entityAlias.id = :ID", entity.GetType.Name, collectionPropertyName)
Dim query = Session.CreateQuery(queryString).SetParameter("ID", entity.ID)
Return query.List

Answer 1:

NHibernate的有一个内置的方法是什么,我认为你所要求做的恰好。 (ISession.CreateFilter)

例如,如果您有有一个名为订单订单的集合加载一个名为客户一个客户的实体,您可以通过这样做加载命令。

var orderQuery = session.CreateFilter(customer.Orders, string.Empty);  
var orders = orderQuery.List<Order>();

这是equivilant到下面,只是干净了一点。

var orderQuery = session.CreateQuery("from orders o where o.Customer.id = :customerId")
                        .SetParameter("customerId", customer.Id);
var orders = orderQuery.List<Order>();

如果你想过滤收集,where子句可以作为第二个参数传递给一个HQL ISession.CreateFilter(object, string)



Answer 2:

为什么不直接加载顺序并访问其详细信息的收集? 如果你能只加载集合,因为订单是必需的关系,你就不能添加到集合。

我认为你是滥用NHibernateUtil.Initialize。 它的目的是强制代理集合初始化(延迟加载)在特殊情况下。 急切装载是延迟加载的相反; 在那种情况下收集将永远被载入与其父对象,就没有必要为代理。 如果你已经有订单对象,然后访问的详细信息收集会导致它被装载。 如果你想急于获取您可以设置在映射选项。



Answer 3:

查询中的NHibernate对象的推荐的方法是使用任一标准API或HQL 。 你有没有对任何这两种方法中的任何原因?

var details = session.CreateCriteria<OrderDetails>().List<OrderDetails>();
var details = session.CreateQuery("from OrderDetails").List<OrderDetails>();

更新:

如果您想要只载入该协会没有加载,你可以使用下面的查询父对象:

var details = session.CreateQuery(
        "select " + 
        "  orderDetail" + 
        "from " + 
        "  Order order," + 
        "  OrderDetail orderDetail " + 
        "where " + 
        "  orderDetail in elements(order.Details)"
    )
    .List<OrderDetail>();


文章来源: Reload association/related collection in NHibernate