Org.hibernate.hql.ast.Query语法异常:找不到合适的构造函数 [英] org.hibernate.hql.ast.QuerySyntaxException: Unable to locate appropriate constructor
本文介绍了Org.hibernate.hql.ast.Query语法异常:找不到合适的构造函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有两个表映射到实体User
和Group
。
@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:在类[UserGroups Bean]上找不到适当的构造函数
尽管我有一个构造函数UserGroupsBean(String userName, List < String > groupName)
这是如何造成的,我如何解决它?
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中。
这篇关于Org.hibernate.hql.ast.Query语法异常:找不到合适的构造函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文