使用带有新类的varargs时无法找到构造函数

时间:2012-03-15 00:18:24

标签: hibernate jpa

我遇到了一个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

2 个答案:

答案 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(但它可能是一个大小为零的数组),因此可能不需要进行空检查。