java .lang.ClassCastException: java .util. Массивы $ ArrayList нельзя преобразовать в java .lang.Integer в DAO - PullRequest
0 голосов
/ 04 марта 2020

В моем классе Dao есть следующий метод

public Collection<Files> findFilesByFolder(Collection<Integer> ids) {
        if (ids.size() > 0) {
            StringBuffer qbe = new StringBuffer("select f from Files f where f.folders.idFolders in ( :id )");
            return super.list(qbe, "id", ids);
        }
        else {
            return new ArrayList<Files>(0);
        }
    }

И когда я вызываю эту функцию, она возвращает java .lang.ClassCastException: java .util.Arrays $ ArrayList не может быть приведенным к java .lang.Integer исключение

, вот объявление list (). И я надеюсь, что hibernate обрабатывает коллекцию. Но не знаю, как это закончится в исключении приведения класса. Спасибо

protected Collection<T> list(StringBuffer qbe, Object... parameterMap) throws InfrastructureException {
        return this.findByQuery(qbe.toString(), parameterMap);
    }

@SuppressWarnings("unchecked")
    public Collection<T> findByQuery(String qbe, Object... parameterMap) throws InfrastructureException {
        return (Collection<T>) anonymousFindByQuery(qbe, parameterMap);
    }
------------------------------------------------------------------------------------------- 
    public Collection<?> anonymousFindByQuery(String qbe, Object ...parameterMap) 
            throws InfrastructureException{
        getSession();
        try {
            Query q = createQuery(qbe, parameterMap);
            return q.list();
        } //end try
        catch (HibernateException ex) {
            WLog.DAOLogger.error("HibernateException", ex);
            throw new InfrastructureException(ex);
        } //end
    }
--------------------------------------------------------------------------------------
protected Query createQuery(String qbe, Object... parameterMap) throws InfrastructureException {
        Session session = getSession();
        Query q = session.createQuery(qbe);

        String formattedQuery = String.format("%s ", qbe);

        for (int i = 0; i < parameterMap.length; i = i + 2) {

            //Put the data in easy to use forms.
            Object key = parameterMap[i];
            Object value = parameterMap[i + 1];
            String formattedKey = String.format(":%s ", key);

            if(value == null || formattedQuery.indexOf(formattedKey) == -1){
                continue;
            }

            if(value instanceof ArrayList){
                q.setParameterList(key.toString(), (Collection<?>)value);
            }
            else{
                q.setParameter(key.toString(), value);
            }
        }
        return q;
    }

1 Ответ

1 голос
/ 04 марта 2020

Проблема может возникнуть, если вы передаете свои элементы в функцию dao funciton publi c Collection findFilesByFolder (Collection ids) с использованием функции Arrays.asList ().

В этом случае экземпляр объекта не будет иметь класс ArrayList. Он будет иметь тип Arrays $ ArrayList. Я предполагаю это на основании сообщения об ошибке, вставленного вами.

Ваш поток кода переходит к другой части вашего l oop, которая вызывает setParameter вместо setParameterList. Когда вы передаете объект Array $ ArrayList в функцию setParameter, он пытается преобразовать объект списка, но по очевидным причинам происходит сбой, поэтому возникает ошибка.

Если вы передаете объект ArrayList, который вы создали с помощью новой функции ArrayList () , Должно работать нормально.

...