0

私はこのような1つのクラスを持っています:

public class BookAuthor {

  private Book book;
  private Author author;
}

Book と Author はエンティティとして定義されます。

データを取得しようとすると、次のようになります。

final String selectCols = "NEW BookAuthor(b,a)";
final org.hibernate.Query q = createQuery(selectCols, params, filters);
result = q.list();
return result;

Hibernate が「q.list()」を実行すると、1 つのクエリを実行して書籍と著者の ID を取得し、結果を繰り返して著者と書籍に関する情報を取得します。つまり、私のログには次のようなものがあります。

select a.ID, b.ID
from authors a , books b

そして、各行について:

select a.ID, a.name
where a.ID = ?

select b.ID, b.title
where b.ID = ?

このようなパフォーマンスを向上させるために、Hibernate に 1 つのクエリで結果を取得するように指示する方法はありますか? :

select a.ID, a.name, b.ID, b.title
from authors a , books b

前もって感謝します。

編集 :

エンティティは、次のようなテーブルと列名を参照して定義されます。

public static final String TABLE_NAME = "AUTHOR";
@Column(name = "id", nullable = false)
protected Long id;

著者と本の間に DB の制約はないと思います (これは実際のエンティティの例にすぎませんが、著者のいない匿名の本がある可能性があるとしましょう)。JB Nizet に感謝します。クエリを取得し、しばらくしてここに投稿します。

4

2 に答える 2

0

これの通常のケースは、アイテムのリストを作成する場合です。この場合、どの分野に関心があるかがわかります。したがって、射影でそれらを指定します (SQL では SELECT 句)。

あなたがそれを行うことを提案している方法は問題ありません。リレーションをマッピングすると、投影リストを指定しているため、Hibernate は 1 回の結合でそれを行います。

違いは、Object[] インスタンスのリストが返されることです。Hibernate は、エンティティへのアンマーシャリングをあなたに任せます。

于 2013-05-09T22:32:04.937 に答える
0

Hibernate クエリを SQL クエリと見なすべきではありません。あなたが求めているのは、休止状態の遅延読み込みだと思います:

BookAuthor をフェッチし、プロパティ Book と Author が遅延ロードされている場合、遅くなります (休止状態は 1 つのエンティティに対して合計で 3 つのクエリを作成する必要があるため)。

そのため、状況に応じて、マッピングで BookAuthor の遅延読み込みを無効にすることができます。これにより、hibernate は 1 つの選択クエリですべてのデータをフェッチします。

于 2013-05-09T12:51:36.333 に答える