我有一对多的关系。我想构建这个查询:
给我所有只有一个孩子的父母和这个孩子child.Type=X
由于我正在学习,请使用Criteria API和HQL向我展示查询。
顺便说一句,是否有任何自动方式可以了解HQL与标准表达式的相同之处?
更新
我似乎在HQL中找到了如何做到这一点:
@"select Parent
from Parent parent
join parent.Children ch
where (ch.Type = :chType) and
(select count(*) from parent.Children) = 1")
但它干得好吗?性能如何?我有直觉,计数(*)不是很好......
答案 0 :(得分:1)
同意@David Pellerin关于这个问题的模糊性。但是,我确实只是整理关于这个主题的午餐''',因此使用典型的客户,订单关系。 。 。
标准API:
public IList<Customer> GetCustomersWithOrdersAfterDate(DateTime sinceDate)
{
return Session.ICriteria.CreateCriteria(typeof(Customer))
.CreateCriteria("Orders")
.Add(Expression.Gt("OrderDate", sinceDate))
.List<Customer>();
}
HQL(看起来像SQL一样,只是你不必知道整个关系图):
public IList<Customer> GetCustomersWithOrdersAfterDate(DateTime sinceDate)
{
Session.CreateQuery("select c from Customer c, c.Orders.elements o WHERE o.OrderDate > :orderDate).SetDateTime("orderDate", sinceDate).List<Customer>();
}
顺便说一句:
如果你只是学习,停止你正在做的一切,然后去看these screencasts。可能是我见过的有关nHibernate的最佳视频集。强烈推荐。
解决“有count = 1”要求的另一个有用链接是here。相当复杂,但我已经适应了一些类似的东西。