2

假设我有一个类产品:

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

如果我想在 HQL 语句中获取NameaProductAmount最后一个Order(由于我的映射OrderBy子句,它是第一个),我该怎么做?像这样的东西(用于说明目的):

select p.Name, p.Orders[0].Amount from Product p

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

// Throws 'Property index does not exist in collection'
select p.Name, order.Amount from Product p join p.Orders as order where index(order) = 0

// Throws 'Antlr.Runtime.MismatchedTreeNodeException' on the brackets in p.Orders[0].
select p.Name, p.Orders[0] from Product P

// Throws 'Object reference not set to an instance of an object'
select p.Name, p.Orders[0].Amount from Product p

// Works fine, but not what I want
select p.name, order.Amount from Product p join p.Orders as order

在此示例中,我可以使用SetMaxResults(),但实际上,查询要复杂得多并且返回许多行 - 所以这不会。

我觉得我在这里遗漏了一些基本的东西,所以任何帮助表示赞赏。

使用:NHibernate 2.1.2.4000 和 Fluent NHibernate 1.1.0.695

4

1 回答 1

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)

它不漂亮,但它可以完成工作。希望这对其他人有帮助...

于 2011-03-31T17:16:33.030 回答