Est-ce possible: JPA/Hibernate query avec la liste des biens dans le résultat?
En veille prolongée je veux exécuter ce JPQL /requête HQL:
select new org.test.userDTO( u.id, u.name, u.securityRoles)
FROM User u
WHERE u.name = :name
userDTO classe:
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...
}
Entité Utilisateur:
@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...
}
Mais quand Hibernate 3.5 (JPA 2) démarre, j'obtiens cette erreur:
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 ]
Est une sélection qui comprend une liste (u.securityRoles) en conséquence pas possible? Dois-je viens de créer 2 séparés des requêtes?
Vous devez vous connecter pour publier un commentaire.
La requête sans le
NEW
(en sélectionnant une valeur scalaire et une collection de valeur expression de chemin d'accès) n'est pas valide, donc je ne pense pas que l'ajout d'unNEW
permettra de faire fonctionner les choses.Pour l'enregistrement, c'est ce que la JPA 2.0 spécification indique dans la section 4.8 Clause SELECT:
Je crois que vous devez déclarer un 0-arg constructeur de votre
UserDTO
classe.EDIT:
Ou un constructeur qui prend
Integer
au lieu deint
comme premier argument. Lors de la recherche de constructeurs en utilisant la réflexion Hibernate peut pas les traiter comme des "compatible" types.En gros, je me concentrerais sur le
Unable to locate appropriate
partie du message.constructor on class [...UserDTO]
Je pense que vous devriez essayer quelque chose comme: