0

こんにちは、休止状態の注釈が付いた単純な製品 Pojo があります。

Class Product
Product ID
name
title
make
colors (1..*) lazy

1行のテキストでproductID、名前、および色のみを取得する方法はありますか?

例:

name: "Monitor"
colors: "Green; Red; Blue;"

理由: ユーザーは 5000 件のリストを必要としており、フィールドに名前と色をリストするだけで済みます。

Hibernate は、データを取得するために 1 つのクエリ (上位 5000) + 5000 のクエリ (色) を必要とします。1クエリだけで取得したいと思っています。

使用: 休止状態の基準

追加: criteria.maxResult(5000) を設定し、FetchMOdel.JOIN を (Criteria.DISTINCT_ROOT_ENTITY); 5000 未満の完全な結果が得られます。これは、各「色」が連続して返されるためです。

4

2 に答える 2

2

結合フェッチを使用して次のクエリを実行すると、製品とともに色が読み込まれます。

select distinct product from Product product 
left join fetch product.colors color 
where ...

HQL は、Hibernate のドキュメントで詳しく説明されています。

「フェッチ」結合を使用すると、値の関連付けまたはコレクションを、単一の選択を使用して親オブジェクトとともに初期化できます。これは、コレクションの場合に特に役立ちます。アソシエーションとコレクションのマッピング ファイルの外部結合と遅延宣言を効果的にオーバーライドします。

基準でそれを行うことは似ています (もっと退屈です: where 句が本当に動的である場合にのみそれを行います):

Criteria c = session.createCriteria(Product.class, "product");
c.setFetchMode("product.colors", FetchMode.JOIN);
c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
c.add(...);

ドキュメントの関連部分は次のとおりです。

setFetchMode() を使用して、実行時に関連フェッチ セマンティクスを指定できます。

あなたはすでにここで Hibernate に関する多くの質問をしています。なぜドキュメントを読まないのですか?

編集:

コメントから、あなたはやりたいことをする方法を知っているように見えますが、最大数の結果を適用するのに問題があるようです.

この問題の最も簡単な解決策は、5000 に制限された最初のクエリを実行して、製品の ID のみをロードすることです。次に、最初のクエリによって取得された一連の ID に含まれる ID を持つ製品とその色をロードする、限定されない 2 番目のクエリを実行します。

select product.id from Product product where ...

select distinct product from Product product 
left join fetch product.colors color 
where product.id in (:productIds)

一部のデータベース (Oracle など) では、句に入れることができる要素の数が制限されていることに注意してください (Oracle ではIN最大 1000 要素)。したがって、5000 個の ID のセットを 1000 個の要素のセットに分割し、この分割ごとにクエリを実行する必要がある場合があります。

于 2012-08-02T14:24:42.130 に答える
0

あなたのデータベースは何ですか?colorsText注釈で注釈を付けたエンティティでを定義できます@Formula('...')。ただし、行ごとに 1 つの文字列を返すクエリを作成する必要があります。

ほとんどのデータベースには、何らかのconcatenate集計関数があります。データベースの関数を見つけてください。

于 2012-08-02T14:31:37.883 に答える