Leider ist mit der Annotation @SqlResultSetMapping nur ein Mappen von Entitäten möglich, aber nicht von einfachen Beans, die für einen Datenaustausch oder eine Visualisierung innerhalb der GUI benötigt werden.
Um diesem Problem aus dem Weg zu gehen, habe ich einen kleinen Mapper erstellt, der es ermöglicht aus einer Liste, welche die Ergebnisse der Query in Arrays von Objekten enthält, eine Liste der gewünschten Beans erzeugt.
- An dieser Stelle werden die entsprechenden Klassen der Objekte ausgelesen und in ein Array gesteckt. Dies ist notwendig, damit man im zweiten Schritt mit Hilfe der Java Reflection API nach einem zugehörigen Konstruktor schauen kann.
- Suche nach dem Konstruktor mit der zugehörigen Signatur, die durch die Liste der Spalten innerhalb der Ergebnismenge definiert ist.
- Erstellen der entsprechenden Beans und hinzufügen zur Liste der Ergebnisse.
Da dies nur funktioniert, wenn die Liste der Ergebnisse mehrere Spalten enthält, habe ich gleichtzeitig noch eine Methode erstellt, die den unwahrscheinlichen Fall abdeckt, dass eine einzelne Spalte in eine Bean gesteckt werden soll. Daher der Vollständigkeit halber auch diese Methode als Screenshot.
Das Problem stellt sich so eigentlich nicht mit
AntwortenLöschen"SELECT NEW constructor_expr" lassen sich sehr viele DTOs bauen.
Zum Beispiel:
"SELECT NEW my.ui.DTO(p.name, p.surname) FROM Person p".
Ist ein alter Hut, ging schon mit JPA 1.
Viele Grüße
Florian
Hallo Florian,
AntwortenLöschenes ist richtig, dass dies bereits mit JPA 1 ging. Dieser Artikel beschäftigt sich allerdings mit dem Mapping von _nativen_ Queries, nicht mit dem Mapping von Ergebnissen aus JPQL Queries.
Die von dir erwähnte Lösung findet sich in dem Artikel zu den JPA Constructor Expressions:
http://saschadoemer.blogspot.com/2010/12/quick-dirty-jpa-constructor-expressions.html
So alt ist der Hut also dann doch wieder nicht ;-)
Gruß
Sascha