2010-12-15 6 views
3

scheine ich keine Antwort auf somthing zu finden, die ich ablehnen, als "nicht möglich" zu akzeptieren :)SELECT NEW() mit many-to-one-Sammlung in der Konstruktor - HQL

Hier ist meine HQL Abfrage: "SELECT neue TestTable (t.id, t.param1, t.param2, t.param3, stps) FROM TestTable t linken Join t.steps als stps WHERE t.someObj.id IN (: someObjIds)"

TestTable hat den folgenden consturtor: public TestTable (Ganzzahl param1, Ganzzahl param2, Datum param3, Datum param4, Setze Schritte)

Ich habe versucht, Sammlung im Konstruktor anstelle eines Satzes zu verwenden, aber es hat nicht funktioniert, der Konstruktor wil Ich empfange nur das erste Element aus der Sammlung als Parameter und nicht die gesamte Sammlung wie erwartet.

in der Abfrage Ich habe auch versucht t.steps holen LEFT JOIN verwenden, versucht, ohne links überhaupt join, versucht, die „STPs“ Parameter im Konstruktor zu umgeben mit „Elemente“ wie folgt aus: Elemente (STPs)

aber nichts hat funktioniert ... der Grund, warum ich das tue ist, weil TestTable sehr groß ist und viele Spalten und Assoziationen hat, aber in diesem Fall möchte ich nur 4 Spalten und eine Sammlung. Wenn eine Abfrage bis zu 400.000 Objekte zurückgeben kann, wird dies erforderlich.

irgendwelche ideen jemand ??? (übrigens, mein Name ist Tomer)

+1

bitte formatieren Sie den Code folgenden Editor Tipps auf der rechten Seite – bluish

+1

Ich habe nicht verstanden, was Sie wollen. – Bozho

Antwort

4

Ihre Abfrage funktioniert möglicherweise ohne 'neuen' Konstruktor, aber es gibt Ihnen nicht, was Sie erwarten.

Diese Abfrage gibt t.id, t.param1, t.param2, t.param3, [eine Entität aus der Steps-Tabelle] für jede Zeile zurück und dupliziert die Ergebnisse aufgrund der linken Join-to-Steps-Tabelle.

Meine Empfehlung ist, zuerst eine Abfrage erstellen, die Daten von TestTable erhält. So etwas wie

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

Dann erstellen Abfragen, die für jeden Testtable Daten aus Schritt Tabelle bekommt.

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

In einem Konstruktorausdruck kann kein pfadbezogener Pfadausdruck verwendet werden. Folgen Sie answer