如何构造这个NHibernate查询

时间:2009-01-23 18:57:20

标签: nhibernate hql

我有一对多的关系。我想构建这个查询:

给我所有只有一个孩子的父母和这个孩子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")

但它干得好吗?性能如何?我有直觉,计数(*)不是很好......

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。相当复杂,但我已经适应了一些类似的东西。