В в спящем режиме, я хочу выполнить этот JPQL / запрос HQL:
select new org.test.userDTO( u.id, u.name, u.securityRoles)
FROM User u
WHERE u.name = :name
класс userDTO:
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...
}
Но то, когда В спящем режиме 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 отдельных запроса?
Запрос без NEW
(выбор скалярного значения и выражения пути с набором значений) недопустим, поэтому я не думаю, что добавление NEW
заставит все работать.
Для записи, это то, что спецификация JPA 2.0 говорит в разделе 4.8 Предложение SELECT :
Предложение SELECT имеет следующий синтаксис :
select_clause :: = SELECT [DISTINCT] select_item {, select_item} * select_item :: = select_expression [[AS] переменная_результатов] select_expression :: = однозначное_путь_выражение | скалярное_выражение | агрегатное_выражение | идентификационная_переменная | ОБЪЕКТ (идентификационная_переменная) | выражение_конструктора выражение_конструктора :: = НОВОЕ имя_конструктора (элемент_конструктора {, элемент_конструктора} *) элемент_конструктора :: = однозначное_путь_выражение | скалярное_выражение | агрегатное_выражение | идентификационная_переменная агрегатное_выражение :: = { {1}} {AVG | МАКС | МИН | SUM} ([DISTINCT] state_field_path_expression) | COUNT ([DISTINCT] identity_variable | state_field_path_expression | single_valued_object_path_expression)
Я считаю, что вам нужно объявить конструктор с 0 аргументами в вашем классе UserDTO
.
РЕДАКТИРОВАТЬ:
Или конструктор, который принимает Integer
вместо int
в качестве первого аргумента. При поиске конструкторов с использованием отражения Hibernate может не рассматривать их как «совместимые» типы.
В основном я бы сосредоточился на Невозможно найти соответствующий конструктор
в части сообщения, относящейся к классу [... UserDTO]
.