Невозможно найти конструктор при использовании varargs с новым классом - PullRequest
2 голосов
/ 15 марта 2012

Я получил исключение в спящем режиме

Причина: 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 ]

1 голос
/ 29 августа 2013

Возможно, уже слишком поздно, но Несколько выражений SELECT можно использовать для решения этой проблемы, если вы используете JPA 2 .

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.

0 голосов
/ 15 марта 2012

Вероятно, именно таким образом 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 (но это может быть массив нулевого размера) при обычном вызове, поэтому проверка нуля может не потребоваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...