Ich habe eine Spring Data-Repository-Methode mit einer nativen Abfrage
@Query(value = "SELECT g.*, gm.* FROM group g LEFT JOIN group_members gm ON g.group_id = gm.group_id and gm.user_id = :userId WHERE g.group_id = :groupId", nativeQuery = true)
GroupDetails getGroupDetails(@Param("userId") Integer userId, @Param("groupId") Integer groupId);
und ich möchte das Ergebnis dem POJO von Nicht-Entitäten zuordnen GroupDetails
.
Ist es möglich und wenn ja, können Sie bitte ein Beispiel nennen?
GroupDetails
markiert werden@Entity
? Wenn möglich, können Sie bitte angeben, auf welche Klasse die Anmerkung@NamedNativeQuery
angewendet werden muss?@SqlResultSetMapping
und@NamedNativeQuery
Anmerkungen müssen auf der Entität vorhanden sein, die in Ihrem Spring Data-Repository verwendet wird (z. B. fürpublic interface CustomRepository extends CrudRepository<CustomEntity, Long>
dieCustomEntity
Klasse)Ich denke, der einfachste Weg, dies zu tun, ist die Verwendung der sogenannten Projektion. Es kann Abfrageergebnisse Schnittstellen zuordnen. Die Verwendung
SqlResultSetMapping
ist unpraktisch und macht Ihren Code hässlich :).Ein Beispiel direkt aus dem JPA-Quellcode von Spring Data:
Mit dieser Methode können Sie auch eine Liste der Projektionen abrufen.
Weitere Informationen zu Projektionen finden Sie in den JPA-Dokumenten dieses Frühlings.
Anmerkung 1:
Denken Sie daran, dass Ihre
User
Entität als normal definiert ist. Die Felder der projizierten Schnittstelle müssen mit den Feldern in dieser Entität übereinstimmen. Andernfalls kann die Feldzuordnung unterbrochen werden (getFirstname()
möglicherweise wird der Wert des Nachnamens usw. zurückgegeben).Anmerkung 2:
Wenn Sie die
SELECT table.column ...
Notation verwenden, definieren Sie immer Aliase, die mit den Namen der Entität übereinstimmen. Zum Beispiel funktioniert dieser Code nicht richtig (die Projektion gibt für jeden Getter Nullen zurück):Aber das funktioniert gut:
Bei komplexeren Abfragen würde ich stattdessen lieber ein
JdbcTemplate
benutzerdefiniertes Repository verwenden.quelle
JdbcTemplate
( docs.spring.io/spring-framework/docs/current/javadoc-api/org/… ) verwenden. Sie können diegetClob
Methode onresultSet
verwenden, um Clob abzurufenInputStream
. Zum Beispiel :rs.getClob("xml_column").getCharacterStream()
.Ich denke, Michals Ansatz ist besser. Es gibt jedoch noch eine weitere Möglichkeit, das Ergebnis aus der nativen Abfrage herauszuholen.
Jetzt können Sie dieses 2D-String-Array in Ihre gewünschte Entität konvertieren.
quelle
Sie können Ihre native oder nicht native Abfrage wie gewünscht schreiben und JPQL-Abfrageergebnisse mit Instanzen benutzerdefinierter Ergebnisklassen umschließen. Erstellen Sie ein DTO mit denselben Namen der in der Abfrage zurückgegebenen Spalten und erstellen Sie einen Konstruktor für alle Argumente mit derselben Sequenz und denselben Namen wie von der Abfrage zurückgegeben. Verwenden Sie dann die folgende Methode, um die Datenbank abzufragen.
DTO erstellen:
quelle
Sie können so etwas tun
Und es muss Konstruktoren geben
quelle
Auf meinem Computer funktioniert dieser Code. Er unterscheidet sich ein wenig von Daimons Antwort.
quelle