2009-01-23 68 views
1

我有一个一对多的关系。我想构建这样的查询:如何构造这个NHibernate查询

给我的一切,都只有一个孩子,这个孩子child.Type = X

因为我是学习,请出示与标准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

我想你会得到更好的回应,如果你发布你的映射文件,代码类和一些示例数据。 – 2009-01-23 19:22:16

回答

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

BTW:
如果您只是在学习,停止你正在做的一切,并去看these screencasts。可能是我见过的有关nHibernate的最佳视频集。极力推荐。

解决您的“有计数= 1”要求的另一个有用链接是here。相当复杂,但我已经适应了类似的一些成功。

+0

谢谢。我的问题是理论上的,这就是为什么我没有例子。我知道标准api的基本要素,但您不会告诉我我要求的主要内容:在您的示例中,我希望获得只有一个订单的客户。 – 2009-01-23 20:25:48