Pregunta

En hibernación quiero ejecutar este JPQL / HQL consulta:

select new org.test.userDTO( u.id, u.name, u.securityRoles)
FROM User u
WHERE u.name = :name

clase 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...
}

El usuario Entidad:

@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 consigo 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 ]

es una selecta que incluye una lista (u.securityRoles) como consecuencia no es posible? ¿Debo crear 2 consultas separadas?

¿Fue útil?

Solución

La consulta sin la NEW (selección de un valor escalar y una expresión de ruta de recogida de valor) no es válido, así que no creo que la adición de un NEW hará que las cosas funcionen.

Para el registro, esto es lo que la especificación JPA 2.0 dice en la sección 4.8 Cláusula SELECT

  

La cláusula SELECT tiene la siguiente   Sintaxis:

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)

Otros consejos

Creo que tienen que declarar un constructor 0-arg en su clase UserDTO.

EDIT: O un constructor que toma Integer en lugar de int como primer argumento. Cuando se busca constructores que utilizan la reflexión de hibernación podría no tratarlos como tipos 'compatibles'.

Básicamente, se centraría en la parte Unable to locate appropriate constructor on class [...UserDTO] del mensaje.

Creo que usted debe intentar algo como:

select new org.test.userDTO( u.id, u.name, u.securityRoles) AS uDTO,
  uDTO.setRoles(u.securityRoles)
 FROM User u
 WHERE u.name = :name
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top