2

わかりました、Hibernate を介してオブジェクトの大きなリストにマップする List メンバーを持つエンティティ クラスがあります。クエリ時にリスト全体を取得する必要はありません。これが適用されるオブジェクトの合計サイズのみが必要です。

  • List は@Whereアノテーションを使用して、要素のサブセットのみを選択します。
  • サイズが非常に大きいため、リストは@LazyCollection(LazyCollectionOption.EXTRA)としてマークされてい ます
  • マッピングは、リンク テーブルを使用して行われます
  • リストには次のようなマッピングがあります。

ここに画像の説明を入力

リストの@JoinTableは、テーブル 2 で結合を使用し、テーブル 3 で逆結合を使用します。私は SQL にあまり精通していないため、生成された SQL が何であるかは完全にはわかりません。

とにかく、 @Where句には、 'STATUS = ACTIVE'や'LETTER = 'A'などの他のものなど、いくつかの制限があります。例が示すように、次のような呼び出しを行うと:

リスト項目 = Lists.getItems();
アイテム.サイズ(); // これにより、@Where 句の制限により 1 が返されます

上記は、@Where 句の制限を使用して、表 3 の正しい項目を項目に入力します。リスト全体を取得せずに最初に試したのは次のとおりです。

int listSize = Lists.getItems().size(); // 結果は 3 で、@Where 句は適用されません

私はそれを調査し、Hibernate でこの問題が修正されたとは思わないことを発見しました: Hibernate Jira


だから、私の質問は、これを行うための最良の方法は何ですか? 私はまだ SQL や HQL に習熟していません。私は結合やその他のデータベース用語にあまり詳しくないので、何かサポートがあれば助かります。

ありがとう!

4

1 に答える 1

1

最終的に、次のクエリを実行してパラメーターを設定しました。

public int getActiveCountOfList(long list_id) {
    String sql = "SELECT COUNT(*) FROM TABLE_2 t2 
                 LEFT JOIN TABLE_3 t3 ON t2.ITEM_ID = t3.ITEM_ID 
                 WHERE t2.LIST_ID = :list_id AND t3.LETTER IN ('A', 'B')
                 AND t3.STATUS = 'ACTIVE'";

    Object result = session.createSqlQuery(sql).setLong("list_id", list_id)
                       .uniqueResult();

    return ((Number) result).intValue();
}
于 2012-12-25T02:49:18.027 に答える