Neues Objekt mit HQL
-
26-09-2019 - |
Frage
Der Versuch, ein Objekt aus einer HQL-Abfrage zu erstellen, sondern kann einfach nicht herausfinden, was ich falsch mache.
Abfrage:
String query = "SELECT product.code, SUM(product.price), COUNT(product.code)
from Product AS product
GROUP BY product.code"
(oder soll ich verwenden, um neuen MyCustomList (product.code, SUM (..., auch wenn es nicht abgebildet ist?) Jetzt möchte ich diese zurückgegebene Liste in ein ähnliches Objekt werfen:
class MyCustomList{
public String code;
public BigDecimal price;
public int total;
// Constructor
public MyCustomList(String code, String price, int total){ //...
Abrufen der Daten:
// This throws ClassCastException
List<MyCustomList> list = MyClass.find(query).fetch();
Mit Play-Rahmen
Lösung
Ich denke, dass der Abschnitt 15.6 . Die SELECT-Klausel Abdeckungen, was Sie versuchen zu erreichen:
15.6. Die select-Klausel
...
Abfragen können mehrere Objekte zurückgeben und / oder Eigenschaften als ein Array des Typs
Object[]
:select mother, offspr, mate.name from DomesticCat as mother inner join mother.mate as mate left outer join mother.kittens as offspr
oder als
List
:select new list(mother, offspr, mate.name) from DomesticCat as mother inner join mother.mate as mate left outer join mother.kittens as offspr
oder - unter der Annahme, dass die Klasse
Family
einen geeigneten Konstruktor hat - als Ist typsichere Java-Objekt:select new Family(mother, mate, offspr) from DomesticCat as mother join mother.mate as mate left join mother.kittens as offspr
In Ihrem Fall möchten Sie wahrscheinlich:
SELECT new MyCustomList(product.code, SUM(product.price), COUNT(product.code))
from Product AS product
GROUP BY product.code
Wo MyCustomList
ist nicht unbedingt eine kartiert Einheit.
Andere Tipps
Ich weiß, dass dies eine alte Post, aber Sie können auch für HQL verwenden:
Query query = session.createQuery("SELECT code AS code FROM Product");
oder diese für SQL:
Query query = session.createSQLQuery("SELECT code AS code FROM Product");
mit:
query.setResultTransformer(Transformers.aliasToBean(MyCustomList.class));