В спящий режим я хочу запустить этот JPQL/HQL запросов: классВозможно ли это: запрос JPA/Hibernate со списком в результате?
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...
}
Пользователь:
@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...
}
Но когда Hibernate 3,5 (JPA 2) начинает получать эту ошибку:
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 ]
Является ли выбор, который включает в себя список (u.securityRoles), в результате невозможен? Должен ли я просто создать 2 отдельных запроса?
Спасибо! Я должен был просто посмотреть его в спецификации JPA. Очевидно, что u.securityRoles не является «single_valued_path_expression». Поэтому я предполагаю, что это означает, что нужно делать отдельные запросы для извлечения коллекций/отношений (или использовать объединение и создавать коллекции с циклом). – Kdeveloper
@Kdeveloper Если у вас есть много атрибутов, я так думаю. Если нет, просто выберите пользователя и выберите его securityRoles. –
@pascal thivent И если JPQL возвращает много пользователей, это в конечном итоге приведет к циклу для получения прав безопасности каждого пользователя? – HopeKing