假设我有一个产品类:
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
答案 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)
它并不漂亮,但它确实起作用了。希望这有助于其他人...