In hibernate voglio correre questo JPQL/interrogazione HQL: classeÈ possibile: la query JPA/Hibernate con la proprietà elenco nel risultato?
select new org.test.userDTO(u.id, u.name, u.securityRoles)
FROM User u
WHERE u.name = :name
userDTO: Entity
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...
}
utente:
@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...
}
Ma quando Hibernate 3.5 (JPA 2) inizia ricevo questo errore:
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 ]
È una selezione che include un elenco (u.securityRoles) come risultato non possibile? Devo solo creare 2 query separate?
Grazie! Avrei dovuto cercarlo nello spec. JPA. Chiaramente u.securityRoles non è un 'single_valued_path_expression'. Quindi immagino questo significhi, bisogna fare query separate per recuperare collezioni/relazioni (o usare un join e creare le collezioni con un ciclo). – Kdeveloper
@Kdeveloper Se il tuo utente ha molti, molti attributi, credo di si. In caso contrario, basta selezionare l'utente e recuperare i suoi ruoli di sicurezza. –
@pascal thivent E se JPQL restituisce molti utenti, alla fine si otterrà un loop per recuperare i SecurityRoles di ciascun utente giusto? – HopeKing