8

私は一方向の多対一の条件でテーブルを結合する方法を便乗していますか? .

2 つのクラスがある場合:

class A {
    @Id
    public Long id;
}

class B {
    @Id
    public Long id;
    @ManyToOne
    @JoinColumn(name = "parent_id", referencedColumnName = "id")
    public A parent;
}

B -> A は多対 1 の関係です。B のコレクションを A に追加できることは理解していますが、その関連付けは必要ありません。

したがって、私の実際の質問は、SQLクエリを作成するHQLまたは基準の方法はありますか?

select * from A left join B on (b.parent_id = a.id)

これにより、A を参照する各 B レコードのデカルト積を持つすべての A レコードが取得され、B を参照していない A レコードが含まれます。

使用する場合:

from A a, B b where b.a = a

それは内部結合であり、参照する B を持たない A レコードを受け取りません。

2 つのクエリなしでこれを行う良い方法を見つけられなかったので、それより少ないものは素晴らしいでしょう。

ありがとう。

4

2 に答える 2

2

あなたが投稿したもので例を作成しましたが、これでうまくいくと思います:

select a,b from B as b left outer join b.parent as aHQLで。

ただし、それを行うための「基準」の方法を見つける必要があります。

于 2010-03-05T18:54:37.830 に答える
1

fetch 属性を指定することで、これを行うことができます。

(10) fetch (オプション) 外部結合フェッチと順次選択によるフェッチのどちらかを選択します。

次の場所にあります: Chapter 6. Collection Mapping、下にスクロールして: 6.2. コレクションのマッピング

編集

生の SQL クエリを実行する方法が必要だったという質問のコメントを読みましたか? ここで、おそらく興味深いかもしれない参照:

第 13 章 - ネイティブ SQL クエリ

そして、HQL を通じてそれを可能にする方法が必要な場合:

第11章 HQL: Hibernate クエリ言語

第 11 章で、 11.3まで下にスクロールします。関連付けと結合

IQuery q = session.CreateQuery(@"from A as ClassA left join B as ClassB");

ただし、ClassB は ClassA のメンバーである必要があると思います。さらに読むと役立ちます。

あなたにとって有用であると思われるもう 1 つのことは、名前付きのクエリです

<query name="PeopleByName">
from Person p
where p.Name like :name
</query>

そして、次のようにコード内からこのクエリを呼び出します。

using (var session = sessionFactory.OpenSession())
    using (var tx = session.BeginTransaction()) {
        session.GetNamedQuery("PeopleByName")
            .SetParameter("name", "ayende")
            .List();
        tx.Commit();
    }

詳しく説明している Ayende の参照リンクをご覧ください。

于 2010-03-05T17:27:06.283 に答える