Помните, что порядковые параметры основаны на 1! - HibernateTemplate
проблема
Код HibernateTemplate…
getHibernateTemplate().find("from Domain d where d.domainName = :domainName", domainName);
Когда я выполняю приведенный выше код, я получаю следующее сообщение об ошибке
java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based! ... at org.hibernate.impl.AbstractQueryImpl.determineType(AbstractQueryImpl.java:397) at org.hibernate.impl.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:369)
Решение
Я захожу внутрь и изучаю файлHibernateTemplate.java и нахожу ниже код
public List find(final String queryString, final Object[] values) throws DataAccessException { return (List) executeWithNativeSession(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { Query queryObject = session.createQuery(queryString); prepareQuery(queryObject); if (values != null) { for (int i = 0; i < values.length; i++) { queryObject.setParameter(i, values[i]); } } return queryObject.list(); } }); }
Из приведенного выше кода HibernateTemplete использует основание на 0 вместо 1. Это проблема библиотеки Spring или гибернации? Поскольку в сообщении об ошибке указанные параметры должны начинаться с 1. Я попробовал какое-то решение, например, изменить библиотеку Spring или гибернации, но оно не работает ...
Кажется, я ошибаюсь, мне нужно снова начать искать решение, сначала я изучаю свой собственный код………… !!! Я не могу представить, насколько я небрежен, я сделал глупую ошибку в своем коде, это не проблема с пружиной или гибернацией, это моя синтаксическая ошибка.
Меняться от
getHibernateTemplate().find(" from Domain d where d.domainName = :domainName", domainName);
To
getHibernateTemplate().find(" from Domain d where d.domainName = ?", domainName);
Проблема решена, код больше выполняется без ошибок.
Note
Сообщение об ошибке, созданное HibernateTemplate, действительно вводит в заблуждение !!!