2009-07-15 6 views
6

私はいくつかのエンティティオブジェクトを設定するためにSQLクエリでNHibernateを使用しています。NHibernate - AddEntityとAddJoinの問題

私はUserオブジェクトを参照するItemオブジェクトを持っている(項目の所有者を示すために)

class Item 
{ 
public User User; 
} 

私のSQLクエリは(それは、私はHQLを使用できない理由である、実際にはもっと複雑だですしかし、私は)AddJoin/AddEntityが働いていたことを確認するために、この使用を開始:ここで

SELECT {i.*}, {u.*} 
FROM Item i INNER JOIN User u ON (i.UserId = u.Id) 
WHere i.Id = 5 

は私のコードです:

var x = session.CreateSQLQuery(sql) 
    .AddEntity("i", typeof(Item)) 
    .AddJoin("u", "i.User") 
    .List(); 

これを実行すると、2次元の配列が得られます。配列の各アイテムには、Itemオブジェクト(Userプロパティが初期化されている)とUserオブジェクトが含まれています。

私には何が欠けていますか?私はUserプロパティを初期化したItemオブジェクトのリストを得ることを望んでいました(これはドキュメントの解釈方法です)。

答えて

0

AddJoinメソッドを省略するとどうなりますか? AddEntityを指定するだけでは不十分ですか?

1

それはしばらくしているが、私はあなたがこの欠けていると思う:すべてのようになどのシングルヒットでこれを得るためにあなたのマッピングがある

.SetResultTransformer(new DistinctEntityRootTransformer()) 
+0

ベン。ありがとう。私はこれを追加しました - .SetResultTransformer(新しいDistinctRootEntityResultTransformer()) - しかし、私は、ユーザーのリストを、希望のリストの項目の代わりに取得します。ルートエンティティはアイテムだと思うので、何か間違っているはずです。 –

+0

別のアドインがある場合、これは機能しません。独自のDistinctRootEntityResultTransformerをロールバックする必要があります。下記参照。 – Trent

0

場合は右のあなただけのフェッチJOINを使用することができた:

var x = session.CreateQuery("from Item i join fetch i.User").List<Item>(); 
+0

Davidに感謝します。実際のSQLは、私が含まれていたものよりはるかに複雑です。なぜ私は最終的な解決にHQLを使用することができないので、基本的なSQLが私が期待したものを返さないのかを理解する必要がありました。 –

5

私はこのことを理解するために午後を無駄にしました。 SetResultTransformer(CriteriaUtil.DistinctRootEntity)は最後に追加されたときに処理されます。

ここでは、クエリから最初のエンティティを取得しました。 1つのキャッチしかし、私はNHibernate.DistinctRootEntityResultTransformer.TransformTuple()を仮想にするために修正しなければならなかった。私たちにとっては大したことではありません。なぜなら、このような簡単な追加のためにすでにNHibernateを分岐させたからです。 NHを分岐させたくない場合は、独自のIResultTransformerをロールして項目が一意であることを確認するのは簡単です。

クエリにこれを追加します。

query.SetResultTransformer(new FirstTupleDistinctResultTransformer()); 

、これは新しいクラスである:

public class FirstTupleDistinctResultTransformer : DistinctRootEntityResultTransformer 
{ 
    public override object TransformTuple(object[] tuple, string[] aliases) 
    { 
     return tuple[0]; 
    } 
} 
1

が、これは

using NHibernate.Transform; 
    //.. 

    var x = session.CreateSQLQuery(sql)  
    .AddEntity("i", typeof(Item))  
    .AddJoin("u", "i.User") 
    .AddEntity("i", typeof(Item)) 
    .SetResultTransformer(new DistinctRootEntityResultTransformer()) 

    .List(); 
3
var x = session.CreateSQLQuery(sql)  
    .AddEntity("i", typeof(Item))  
    .AddJoin("u", "i.User") 
    .AddEntity("i", typeof(Item)).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 

それが唯一のアイテムを返しますしてみてください

関連する問題