我遇到了一个hibernate异常
引起:org.hibernate.hql.ast.QuerySyntaxException:无法在类上找到合适的构造函数
我的查询是"Select new example.ReportField(r.memberName, r.address) from Member r"
public class ReportField {
public List<String> fieldValueList = new ArrayList<String>();
public ReportField(Object... fields) {
System.out.println("-----ReportField------");
if (fields != null) {
for (Object field : fields) {
String fieldStr = field.toString();
String[] temp = fieldStr.split(":");
System.out.println("temp.length = " + temp.length);
if (temp != null && temp.length == 2
&& "uuid".equals(temp[0].toLowerCase())) {
fieldValueList.add(SysUtil.getNodeByUUID(temp[1]));
} else {
fieldValueList.add(fieldStr);
}
}
}
}
public List<String> getFieldValueList() {
return fieldValueList;
}
public void setFieldValueList(List<String> fieldValueList) {
this.fieldValueList = fieldValueList;
}
}
如果我将构造函数更改为
public ReportField(String memberName, String memberAddress) and it works
答案 0 :(得分:1)
可能为时已晚,但只要您使用 JPA 2 ,就可以使用多个SELECT表达式解决此问题。
TypedQuery<Object[]> query = em.createQuery(
"SELECT r.memberName, r.address FROM Member r", Object[].class);
List<Object[]> results = query.getResultList();
List<ReportField> fields = new ArrayList<ReportField>(); // Use your favorite class instead of ArrayList if necessary
for (Object[] result : results) {
fields.add(new ReportField(result));
}
或者,您可以连接所有字段,然后将结果字符串传递给构造函数。
您还可以动态生成一个新类(使用Javassist),然后将此类传递给Hibernate。
答案 1 :(得分:0)
这可能只是hibernate确定哪些构造函数可用的方式,而不是通过管理hibernate代码的深度来找出原因,你可以“继续”并像这样解决它:
public ReportField(Object... fields) {
if (fields.length == 2) {
init(fields[0], fields[1]);
return;
}
// current code
}
public ReportField(String memberName, String memberAddress) {
init(memberName, memberAddress);
}
private void init(String memberName, String memberAddress) {
// whatever you need to do here
}
顺便提一下,当正常调用时,varargs参数永远不会是null
(但它可能是一个大小为零的数组),因此可能不需要进行空检查。