Помните, что порядковые параметры основаны на 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, действительно вводит в заблуждение !!!