我正在尝试使用Nhibernate加载聚合根的子集合。向客户加载已发货的所有订单。这可能吗?
答案 0 :(得分:3)
好吧,您可以公开在地图中过滤的属性,如下所示:
<bag name="shippedOrders" ... where="Status == 'Shipped'" >
<key column="CustomerId" />
<one-to-many class="Order" />
</bag>
'where'属性是任意SQL。
理论上,您可以拥有Customer,Orders和ShippedOrders的两个属性。但是,我应该说我没有这样做,我想测试NH在这种情况下如何处理级联。在任何情况下,添加/删除新项目时都必须注意将它们正确添加/删除到两个集合中。
您想要这样做的事实让我们想知道Order是否是聚合根。从长远来看,这可能不那么麻烦:
orderRepository.GetOrders(int customerId, OrderStatus[] statuses)
答案 1 :(得分:1)
您可以通过另一种方式查看 - 加载客户的所有已发货订单。
session.CreateCriteria( typeOf(Order) )
.Add( Restrictions.Eq("Shipped", shippedStatus ) )
.Add( Restrictions.Eq("Customer", requiredCustomer) )
.List<Order>();
答案 2 :(得分:1)
你也可以使用session.Filter(customer.Orders,“where this.Status =='Shipped'”)使用HQL;
答案 3 :(得分:1)
ICriteria crit = session.CreateCriteria (typeof(Customer));
crit.CreateAlias ("Orders", "o");
crit.Add (Expression.Eq ("o.Status", shippedStatus));
crit.Add (Expression.Eq ("Id", customerId));
return crit.UniqueResult <Customer>();
类似的东西。