Возможно ли это: JPA / Hibernate запрос со списком свойства в результате? - PullRequest
13 голосов
/ 21 апреля 2010

В спящем режиме я хочу выполнить этот запрос 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 отдельных запроса?

Ответы [ 3 ]

10 голосов
/ 21 апреля 2010

Запрос без 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)
1 голос
/ 21 апреля 2010

Полагаю, вам нужно объявить конструктор 0-arg в вашем UserDTO классе.

EDIT: Или конструктор, который принимает Integer вместо int в качестве первого аргумента. При поиске конструкторов, использующих отражение, Hibernate может не рассматривать их как «совместимые» типы.

По сути, я бы сосредоточился на Unable to locate appropriate constructor on class [...UserDTO] части сообщения.

0 голосов
/ 02 июня 2011

Я думаю, что вы должны попробовать что-то вроде:

select new org.test.userDTO( u.id, u.name, u.securityRoles) AS uDTO,
  uDTO.setRoles(u.securityRoles)
 FROM User u
 WHERE u.name = :name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...