在hibernate状态下,我想运行此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... }
但是当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个单独的查询吗?
没有NEW(选择标量值 和 集合值的路径表达式)的查询无效,因此我认为添加a NEW不会使事情起作用。
NEW
作为记录,这是JPA 2.0规范在 4.8 SELECT子句中 所说的:
SELECT子句具有以下语法: select_clause ::= SELECT [DISTINCT] select_item {, select_item}* select_item ::= select_expression [ [AS] result_variable] select_expression ::= single_valued_path_expression | scalar_expression | aggregate_expression | identification_variable | OBJECT(identification_variable) | constructor_expression constructor_expression ::= NEW constructor_name ( constructor_item {, constructor_item}* ) constructor_item ::= single_valued_path_expression | scalar_expression | aggregate_expression | identification_variable aggregate_expression ::= { AVG | MAX | MIN | SUM } ([DISTINCT] state_field_path_expression) | COUNT ([DISTINCT] identification_variable | state_field_path_expression | single_valued_object_path_expression)
SELECT子句具有以下语法:
select_clause ::= SELECT [DISTINCT] select_item {, select_item}* select_item ::= select_expression [ [AS] result_variable] select_expression ::= single_valued_path_expression | scalar_expression | aggregate_expression | identification_variable | OBJECT(identification_variable) | constructor_expression constructor_expression ::= NEW constructor_name ( constructor_item {, constructor_item}* ) constructor_item ::= single_valued_path_expression | scalar_expression | aggregate_expression | identification_variable aggregate_expression ::= { AVG | MAX | MIN | SUM } ([DISTINCT]
state_field_path_expression) | COUNT ([DISTINCT] identification_variable | state_field_path_expression | single_valued_object_path_expression)