In Hibernate möchte ich diese JPQL/HQL-Abfrage auszuführen:Ist das möglich: JPA/Hibernate-Abfrage mit Listeneigenschaft in Ergebnis?
select new org.test.userDTO(u.id, u.name, u.securityRoles)
FROM User u
WHERE u.name = :name
userDTO Klasse:
public class UserDTO {
private Integer id;
private String name;
private List<SecurityRole> securityRoles;
public UserDTO(Integer id, String name, List<SecurityRole> securityRoles) {
this.id = id;
this.name = name;
this.securityRoles = securityRoles;
}
...getters and setters...
}
Benutzer Entity:
@Entity
public class User {
@id
private Integer id;
private String name;
@ManyToMany
@JoinTable(name = "user_has_role",
joinColumns = { @JoinColumn(name = "user_id") },
inverseJoinColumns = {@JoinColumn(name = "security_role_id") }
)
private List<SecurityRole> securityRoles;
...getters and setters...
}
Aber wenn Hibernate 3.5 (JPA 2) startet ich bekomme diesen Fehler:
org.hibernate.hql.ast.QuerySyntaxException: Unable to locate appropriate
constructor on class [org.test.UserDTO] [SELECT NEW org.test.UserDTO (u.id,
u.name, u.securityRoles) FROM nl.test.User u WHERE u.name = :name ]
Ist eine Auswahl, die eine Liste enthält (u.securityRoles) als Ergebnis nicht möglich? Soll ich nur zwei separate Abfragen erstellen?
Danke! Ich hätte es einfach in der JPA-Spezifikation nachschlagen sollen. Die u.securityRoles sind eindeutig kein 'single_valued_path_expression'. Also ich denke, das bedeutet, dass man separate Abfragen für das Abrufen von Sammlungen/Relationen durchführen muss (oder einen Join verwenden und die Sammlungen mit einer Schleife erstellen). – Kdeveloper
@Kdeveloper Wenn Ihr Benutzer viele, viele Attribute hat, denke ich. Wenn nicht, wähle einfach den Benutzer und hole seine securityRoles. –
@pascal thivent Und wenn die JPQL viele Benutzer zurückgibt, wird es schließlich zu einer Schleife führen, um die securityRoles jedes Benutzerrechts zu erhalten? – HopeKing