2010-12-15 9 views
3

私は私が「可能ではない」として受け入れることを拒否気にいらに対する答えを見つけるように見えることはありません:)ここSELECT NEW()多対一のコンストラクタの内部のコレクションで - HQL

は私のHQLですクエリ: "SELECT new testTable(t.id、t.param1、t.param2、t.param3、stps)FROM TestTable tはstpsとして結合t.stepsを残しましたWHERE t.someObj.id IN(:someObjIds)"

TestTableには以下のコンターがあります:public TestTable(Integer param1、Integer param2、Date param3、Date param4、Date param4、Set steps)

私はコレクションではなくコンストラクタを使用しようとしましたが、ウィル私は、コレクションの最初のアイテムだけをパラメータとして受け取って、コレクション全体ではなく、私が期待したとおりに受け取っています。私も残さずに全く参加してみました、左t.stepsをフェッチ結合を使用しようとしたクエリで

は、このような「要素」とコンストラクタに「STPS」パラメータを囲むようにしようとした:要素(STPS)

しかし、何も働いていない...私はこれをやっている理由は、TestTableは非常に大きく、多くの列とassosiationsがありますが、この場合私はわずか4列と1つのコレクションが欲しいです。あるクエリーが最大400,000個のオブジェクトを返すことができれば、これは必要なくなります。

(btw、私の名前はTomerです)

+1

右のエディタのヒントに従ってください。 – bluish

+1

私はあなたが望むものを理解できませんでした。 – Bozho

答えて

4

「新しい」コンストラクタなしでクエリが機能するかもしれませんが、期待通りのものはありません。

このクエリは、各行にt.id、t.param1、t.param2、t.param3、[ステップテーブルの1つのエンティティ] を返し、左側の結合をステップテーブルに基づいて結果を複製します。

私がお勧めするのは、まずTestTableからデータを取得するクエリを作成することです。その後

List<TestTable> resultList = "select new TestTable(t.id,t.param1,t.param2,t.param3) from TestTable where 
         t.someObj.id in (:someObjId)" 

よう 何か、それぞれのTestTableのためのステップテーブルからデータを取得するクエリを作成します。

for (TestTable tt : resultList) { 
    List<Steps> stepList = "select st from Steps st where st.testTable.id = :ttId"; 
    tt.setSteps(stepList); 
} 
2

コンストラクタ式では、コレクション値のパス式を使用できません。フォローしてくださいanswer

関連する問題