2

クラス Product があるとします。

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 ステートメントの最後の(マップされた句のため、最初の)NameProductと同様に を取得したい場合、どうすればよいでしょうか? このようなもの(説明目的):AmountOrderOrderBy

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 に答える