我有两个实体,即客户和订单,它们独立存在,并且在映射文件中没有定义任何关系。
现在我想让nhibernate给我以下查询的结果:
select customer.id,customer.name from customer,order
where customer.id = order.id
and order.status = "Open"
我尝试使用投影但是在检查输出sql时我看到Nhibernate生成了一个子查询,这不是我的意图(性能较差?)
public IList<Customer> GetOpenOrders()
{
DetachedCriteria orders = DetachedCriteria.For<Order>("orders")
.SetProjection(Projections.Property("orders.id"));
ICriteria cret = session.CreateCriteria(typeof(Customer))
.Add(Subqueries.PropertyIn("id", orders))
.Add(Expression.Eq("Status", "open"));
return cret.List<Customer>();
}
是否可以使用标准执行此操作,还是有更好的方法来完成此类查询?
答案 0 :(得分:1)
我不确定您是否可以使用ICriteria API执行此操作,因为ICriteria查询是针对特定对象创建的,但您应该能够使用HQL执行此操作:
select customer
from Customer customer, Orders order
where customer.id = order.id and order.status = 'Open'
答案 1 :(得分:1)
更好的方法是将客户与映射中的订单相关联。
这在映射中要多做一些工作,但使用客户和订单对象编写查询和代码的工作量会减少。
答案 2 :(得分:1)
如果您的客户收到订单,那么您可以使用:
ICriteria cret = session.CreateCriteria(typeof(Customer))
.CreateCriteria("orders")
.Add(Expression.Eq("Status", "open"));