使用NHibernate 2.1,如何使用HQL在select子句中使用它来获取集合中的第一个项目?

时间:2011-03-30 23:14:55

标签: nhibernate collections hql indexer

假设我有一个产品类:

public class Product
{
    public virtual string Name { get; set; }
    public virtual IList<Order> Orders { get; set; }
}

和班级订单:

public class Order
{
    public virtual float Amount { get; set; }
    public virtual DateTime Created { get; set; }
}

假设它们被映射(使用Fluent NHibernate),如下所示:

public class ProductMap : ClassMap<Product>
{
    public ProductMap()
    {
        Map(x => x.Name);
        HasMany(x => x.Orders).OrderBy("created desc");
    }
}

public class OrderMap: ClassMap<Order>
{
    public OrderMap()
    {
        Map(x => x.Amount);
        Map(x => x.Created);
    }
}

如果我想获取Name的{​​{1}}以及上一个Product的{​​{1}}(由于我的映射Amount在HQL语句中,是第一个),我该怎么做呢?像这样的东西(用于说明目的):

Order

我尝试了很多变种,每个都有自己的错误。

OrderBy

在这个例子中,我可以使用select p.Name, p.Orders[0].Amount from Product p ,但实际上,查询要复杂得多并且返回很多行 - 所以这不行。

我觉得我在这里缺少一些基本的东西,所以感谢任何帮助。

使用:  NHibernate 2.1.2.4000和Fluent NHibernate 1.1.0.695

1 个答案:

答案 0 :(得分:1)

嗯,这不能回答你是否可以通过HQL从集合中的索引中提取项目的问题,但我确实为我的实现找到了解决方案:

我需要集合中的第一个或最后一个项目,并且具有最小/最大聚合函数的子查询来拯救。 @Mauricio让我更深入地思考SQL中的替代方案,得出了答案:

select p.Name, order.Amount from Product p join p.Orders as order 
where order.Id = (select max(order2.Id) from Product p2 
join p2.Orders as order2 where p2.Id = p.Id)

它并不漂亮,但它确实起作用了。希望这有助于其他人...