18

アドレスを含むテーブルと写真を含むテーブルの 2 つのテーブルがあります。それらの間の唯一の共通フィールドは PersonID です。これらは、住所と写真の 2 つの POJO クラスにマップされました。条件を作成し、フィールドに制限を追加することで、これらのテーブルの詳細を取得できました。2 つのテーブルの結合をどのように記述すればよいでしょうか。アドレスと写真の 2 つのオブジェクトとして結果を取得することは可能ですか。

写真のない人物の記録も取得できるように、左結合を実行したいと考えています。これはhqlを使用してのみ可能であると読みましたが、基準を使用してこれを行うことはできますか?

4

6 に答える 6

20

Theta Join を使用して、結果を 2 つのオブジェクトとして返す HQL クエリを簡単に作成できます (Adrian が指摘したように)。次に例を示します。

String queryText = "select address, photo from Address address, Photo photo " 
                 + " where address.personID=photo.personId";
List<Object[]> rows = session.createQuery(queryText).list();

for (Object[] row: rows) {
    System.out.println(" ------- ");
    System.out.println("Address object: " + row[0]);
    System.out.println("Photo object: " + row[1]);
}

ご覧のとおり、クエリは、フェッチされた各行を表す Object[] 配列のリストを返します。この配列の最初の要素には 1 つのオブジェクトが含まれ、2 番目の要素には別のオブジェクトが含まれます。

編集:

左結合の場合、(HQL クエリではなく) ネイティブ SQL クエリを使用する必要があると思います。これを行う方法は次のとおりです。

String queryText = "select address.*, photo.* from ADDRESS address 
                    left join PHOTO photo on (address.person_id=photo.person_id)";

List<Object[]> rows = sess.createSQLQuery(queryText)
                          .addEntity("address", Address.class)
                          .addEntity("photo", Photo.class)
                          .list();

これはあなたのケースでうまくいくはずです。

于 2012-08-06T07:40:30.050 に答える
0

参加したいクラスを含むクラスを用意して、それらをまとめておくのが最善です。

ただし、一時的な目的でこれらのテーブルを結合する場合は、基準を使用して各テーブルからデータを手動でロードし、それらをまとめることができます。(もちろん、Address と Photo に 2 つの別々のクラスとテーブルがある場合、これらのテーブルのデータを別々に持つことができます)

于 2012-08-06T05:07:34.873 に答える
0

あなたが探しているのは

  1. HQL
  2. リレーションシップとしてモデル化していないフィールドに参加する
  3. 左結合

(質問が最初に行われ、この回答が提供された時点で) Hibernate は、1 と 2 を実行できる Theta 結合をサポートしています。ただし、theta 結合スタイルで使用できるのは内部結合のみです。

個人的には、適切な関係をモデル化することをお勧めします。そのため、HQL で十分にサポートされている 1 と 3 だけが必要です。

(別の回答では、そのような機能を提供する新しい Hibernate 機能の更新が実際に提供されました。これを参照するだけでかまいません)

于 2012-08-06T04:13:00.480 に答える