1

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

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

但它做得好吗?表现如何?我的直觉是 count(*) 位置不太好......

4

1 回答 1

1

同意@David Pellerin 关于问题的模糊性。然而,我实际上只是在整理关于这个主题的午餐'n'Learn,所以使用典型的客户,订单关系。. .

标准 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>();
}

顺便说一句:
如果您只是在学习,请停止您正在做的一切并观看这些截屏视频。可能是我看过的关于 nHibernate 的最好的一组视频。强烈推荐,强烈推荐。

解决您的“计数 = 1”要求的另一个有用链接是此处。相当复杂,但我已经成功地改编了类似的东西。

于 2009-01-23T20:10:23.323 回答