JPA-Daten-Repositorys, mit SqlResultSetMapping und native queries
Ich steckte mit die folgende situation:
Meine Einheiten sind miteinander verwandt, aber in einer Weise, die ich nicht nutzen konnte JPQL. Ich war gezwungen, verwenden Sie das native SQL. Jetzt möchte ich anzeigen dieser Ergebnisse in ein ValueObject. Klar, ich will nicht, um eine Liste von Object-Arrays (List<Object[]>
). Ich habe 6 Personen, von dem aus ich Brauch nur ein paar Spalten. Kann jemand mir ein Beispiel auf, wie die Implementierung einer solchen Zuordnung eines einheitlichen Abfrage?
Tutorial , die ich durchgemacht habe.
Mein code:
@SqlResultSetMapping(
name = "findAllDataMapping",
classes = @ConstructorResult(
targetClass = MyVO.class,
columns = {
@ColumnResult(name = "userFirstName"),
@ColumnResult(name = "userLastName"),
@ColumnResult(name = "id"),
@ColumnResult(name = "packageName")
}
)
)
@NamedNativeQuery(name = "findAllDataMapping",
query = "SELECT " +
" u.first_name as userFirstName, " +
" u.last_name as userLastName, " +
" i.id as id, " +
" s.title as packageName, " +
"FROM " +
" invoice as i " +
"JOIN user as u on i.user_id=u.id " +
"LEFT JOIN subscription_package as s on i.subscription_package_id=s.id " +
"where u.param1=:param1 and i.param2=:param2" +
)
public class MyVO {
private String userFirstName;
private String userLastName;
private Long id;
private String packageName;
public MyVO (String userFName, String userLName,
Long id, String packageName) {
this.userFirstName = userFName;
this.userLastName = userLName;
this.id = id;
this.packageName = packageName;
}
//getters & setters
}
In meinem jpa-repository-Modul:
public interface MyRepository extends JpaRepository<MyEntity, Long> {
List<MyVO> findAllOfMyVO(@Param("param1") String param1, @Param("param2") String param2);
}
Der Punkt ist, dass ich nicht weiß, wo diese Anmerkungen so kann ich mit dieser Art der Zuordnung. In einer native-Abfrage, die ich nicht verwenden kann new rs.rado.leo.mypackage.MyVO(...)
. Ich bekam folgende Fehlermeldung:
Verursacht durch:
org.springframework.data.mapping.PropertyReferenceException: No property findAllOfMyVO found for type MyEntity!
Nehme ich an, dass meine Frage klar ist. Wenn nicht, lass es mich wissen, damit ich Bearbeiten kann meine Frage stellen.
Vielen Dank im Voraus!
- Die anser ist hier: stackoverflow.com/a/42942353/355438
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fügen Sie die fehlenden resultClass
Oder
und schließlich rufen Sie die Abfrage im repository
Sind Sie fast dort, aber für die nachfolgenden Teile
@SqlResultSetMapping
und@NamedNativeQuery
werdenanwesend in der Person und nicht das value-Objekt. In deinem Fall sollte es in die Klasse MyEntity und **nicht ** die MyVO Klasse. Dies sollte zu lösen die Ausnahme.
Dass noch nicht tun. Nachdem Sie die oben, ändern Sie die unten
@NamedNativeQuery(name = "findAllDataMapping",
zu
@NamedNativeQuery(name = "MyEntity.findAllDataMapping",
Schließlich, in einigen Fällen müssen Sie explizit in Ihre definition von @ColumnResult(name = "userFirstName"). Wenn es ist ein Komplexes Feld wie ZonedDateTime oder Boolean, die Sie haben können, um ausdrücklich state @ColumnResult(name = "date_created", type = ZonedDateTime.class).
Hoffe, das hilft.
Müssen Sie markieren Sie Ihre Abfrage als query 🙂
Und Sie benötigen MyVO statt MyEntity, denn das ist die Entität, die Sie haben Ihre resulsts zugeordnet
"Not a managed type"
bedeutet wohl, dass der Frühling noch nicht abgesucht @Entity-Klasse oder das Paket mit der Klasse. Stellen Sie sicher, Sie haben in Ihremapplication.properties
Zeile besagt, dassentitymanager.packagesToScan=com.mypack.entity
Not a managed type
problem, @elamas? In meinem Fall, MyVO ist in der Tat nicht eine Person, aber ich will anzeigen, die Ergebnisse meiner Abfrage MyVO dennoch.