Это возможное: JPA/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...
}

Но то, когда В спящем режиме 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 отдельных запроса?

13
задан Kdeveloper 20 April 2010 в 22:02
поделиться

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) 
 
10
ответ дан 2 December 2019 в 01:20
поделиться

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

РЕДАКТИРОВАТЬ: Или конструктор, который принимает Integer вместо int в качестве первого аргумента. При поиске конструкторов с использованием отражения Hibernate может не рассматривать их как «совместимые» типы.

В основном я бы сосредоточился на Невозможно найти соответствующий конструктор в части сообщения, относящейся к классу [... UserDTO] .

1
ответ дан 2 December 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: