2015-09-28 4 views
0

У меня есть две таблицы, сопоставленные объектам User и Group.org.hibernate.hql.ast.QuerySyntaxException: невозможно найти соответствующий конструктор

@Entity 
@Table(name = "T_COM_USER") 
public class User { 
    private String userName; 
    @Column(name="F_USERNAME", length=60) 
    public String getUserName() { 
     return userName; 
    } 
    public void setUserName(String userName) { 
     this.userName = userName; 
    } 
} 
@Entity 
@Table(name="T_COM_USERGROUP") 
public class UserGroup{ 
    private String groupName; 
    @Column(name="F_GROUPNAME", length=60) 
    public String getGroupName() { 
     return groupName; 
    } 
    public void setGroupName(String groupName) { 
     this.groupName = groupName; 
    } 
} 

Один User может иметь много Group с. Мне нужно моделировать их для того, чтобы отобразить пользователей со всеми их группами в виде таблицы в интерфейсе, как показано ниже:

+-------+----------------------+ 
| Users |  Groups  | 
+-------+----------------------+ 
| User1 | Group1,Group2,Group3 | 
| User2 | Group1,Group2  | 
| User3 | Group2,Group4  | 
+-------+----------------------+ 

Так что я создал этот DTO:

public class UserGroupsBean { 
    private List<String> groupName; 
    private String userName; 
    public UserGroupsBean(String userName, List<String> groupName) { 
     this.userName = userName; 
     this.groupName = groupName; 
    } 
    // Getters 
    public List<String> getGroupName() { return groupName; } 
    public String getUserName() { return userName; }    
    // Setters 
    public void setGroupName(List<String> groupName) { this.groupName = groupName; } 
    public void setUserName(String userName) { this.userName = userName;} 
} 

Я использовал этот запрос, чтобы вернуться все группы для каждого пользователя:

String hql = "select new odatabase.service.beans.UserGroupsBean(userName,(select groupName from UserGroup)) from User"; 

Но я получил:

org.hibernate.hql.ast.QuerySyntaxException: Не удалось найти подходящий конструктор по классу [UserGroupsBean]

Хотя у меня есть конструктор UserGroupsBean(String userName, List <String> groupName)

Как это вызвано и как я могу решить эту проблему?

+0

Вам нужно получить полное имя класса в выражении конструктора в HQL, например 'com.example.UserGroupsBean (...)'. – Tiny

+0

да, конечно, я пишу полное имя класса в своем коде, ошибка в том, что он не находит конструктор с этими свойствами (String и List ) –

+0

'List ' может не поддерживаться в таких запросах (не уверен о HQL, но в критериях JPQL/JPA, это запрещено). – Tiny

ответ

1

Выражение конструктора JPQL поддерживает только плоские результаты, поэтому вам не повезло. Вы можете использовать такой запрос, как SELECT u.userName, g.groupName FROM User u JOIN u.userGroups g, но тогда вам нужно будет уменьшить результат самостоятельно.

Что вы хотите сделать, это можно сделать с помощью Blaze-Persistence Entity Views. Вот пример кода.

@EntityView(User.class) 
public interface UserGroupsBean { 
    // The id of the user 
    @IdMapping("id") int getId(); 

    String getUserName(); 

    @Mapping("userGroups.name") 
    List<String> getGroupNames(); 
} 

Это по существу DTO с некоторыми метаданными. А вот код для выполнения запросов:

EntityManager entityManager = // jpa entity manager 
CriteriaBuilderFactory cbf = // query builder from Blaze-Persistence 
EntityViewManager evm = // manager that can apply entity views to query builders 

CriteriaBuilder<User> builder = cbf.create(entityManager, User.class); 
List<UserGroupsBean> result = evm.applySetting(
    builder, 
    EntityViewSetting.create(UserGroupsBean.class) 
).getResultList(); 

Это будет генерировать запрос, подобный этому

SELECT u.id, u.userName, g.groupName FROM User u JOIN u.userGroups g 

и автоматически сопоставляет результат для вас в DTO.

+0

upvote for ** выражение для конструктора поддерживает только плоские результаты ** –

Смежные вопросы