<join>
次のような要素にマップされたエンティティがあります。
<class name="Entity" table="Entites">
<id name="Id">
<generator class="guid" />
</id>
<property name="SomeProperty" />
<join table="EntityData" optional="true">
<key column="entity_id" />
<property name="SomeDataProperty />
</join>
</class>
そして、このエンティティを次のようにクエリする必要があるネイティブ SQL クエリ (実際のクエリはもちろんもっと複雑で、他のタイプの NHibernate クエリでは利用できない Oracle 機能を使用します):
var query = session.CreateSQLQuery(
"select {entity.*} from Entities {entity}" +
"left outer join EntityData data on {entity}.Id = data.entity_id"
);
query.AddEntity("entity", typeof(Entity));
しかし、NHibernate が結合プロパティに間違ったエイリアス ("entity_1_") を挿入するため、これは機能しません。
また、テーブル エイリアスを "{data}" として指定しようとしましたが、NHibernate はそれを置き換えません (プレーン SQL の中括弧はまだ含まれています)。
結合結果をクエリ ( ) に追加してquery.AddJoin("data", "entity.EntityData")
も機能しません。私はこれをデバッグしましたが、ある時点でプロパティがコレクションまたはエンティティであるかどうかをチェックするため、NHibernate はそれを無視します (ただし、これはコンポーネントであるため、if 条件はどちらも true ではありません)。
回避策は、NHibernate が生成するように結合エイリアスを正確に指定することです (私の場合は「entity_1_」)。その後、すべてが機能します。
これを正しく解決する方法を知っている人はいますか?
編集:継承マッピングでマップされたエンティティをクエリするときに、同じ問題が発生しています。ベース エンティティのエイリアスを定義できますが、継承されたエンティティには entity_1_、entity_2_ などの名前が付けられます。