En hibernación que desea ejecutar este JPQL/HQL consulta: clase¿Es esto posible: consulta JPA/Hibernate con propiedad de lista en el resultado?
select new org.test.userDTO(u.id, u.name, u.securityRoles)
FROM User u
WHERE u.name = :name
userDTO: Entidad
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...
}
usuario:
@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...
}
Pero cuando Hibernate 3.5 (APP 2) comienza me sale este error:
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 ]
¿No es posible seleccionar un listado que incluya una lista (u.securityRoles) como resultado? ¿Debo simplemente crear 2 consultas separadas?
¡Gracias! Debería haberlo buscado en la especificación de JPA. Claramente, u.securityRoles no es una 'single_valued_path_expression'. Así que supongo que esto significa que uno tiene que hacer consultas separadas para recuperar colecciones/relaciones (o usar una unión y crear las colecciones con un bucle). – Kdeveloper
@ Kdeveloper Si su usuario tiene muchos atributos, supongo que sí. Si no, simplemente selecciona al usuario y busca sus securityRoles. –
@pascal thivent Y si el JPQL devuelve muchos usuarios, eventualmente resultará en un bucle para recuperar los securityRoles de cada usuario ¿no? – HopeKing