В нашем проекте есть требование изменить сгенерированный запрос перед его запуском.JPA hibernate in clause query
Таким образом, у нас есть пользовательский завод репозитория, который добавит дополнительные параметры к запросу.
Вот как это делается сейчас.
У нас есть Query Delegatte, который реализует javax.persistence.Query где мы перехватывать сгенерированный запрос и добавить дополнительные параметры
Это работает нормально, до сих пор с Hibernate 4.1.4
Теперь повышен до Hibernate 5.2.2 и jpa 2.2
В основном мы читаем параметры и возвращаем их обратно к объекту запроса. Он работает для всех типов параметров, кроме списка.
private void setParameters(Query query) {
try {
Iterator<?> iter = getParameters().iterator();
while (iter.hasNext()) {
LOGGER.debug("Setting Parameter...");
Parameter param = (Parameter) iter.next();
Object obj = null;
try {
obj = getParameterValue(param);
} catch (Exception e) {
LOGGER.debug("****Exception while getting param value****:" + e.getMessage());
}
query.setParameter(param.getName(), obj);
}
} catch (Exception e) {
LOGGER.error("****Exception in setParameters:****:" + e.getMessage());
}
}
Он терпит неудачу в сценариях, где положение IN используется и список передается в качестве параметра, как показано ниже
@Query("select new com.mypackage.UserInfo(m.usrmstId, m.usrName)
from UsrMst m where m.usrName in :names ")
public List<UserInfo> getUserByNames(@Param("names")List<String> names);
я получаю ниже исключение при чтении такого типа параметров сбора.
Could not resolve QueryParameter reference [[email protected]] to QueryParameterBinding
Есть ли какие-либо изменения в спящем режиме 5.2.2 в параметре списка пути?
В режиме отладки я заметил, что expectedType для объекта org.hibernate.engine.query.spi.NamedParameterDescriptor является String. Будет ли это проблемой? Если это не список?
Вы пробовали проверить 'ли obj' является' экземпляр Collection' и если это так, вызов '# setparameterList' вместо' # setParameter' или является ошибкой, исходящей от вызова '# getParameterValue'? – Naros
Ошибка при вызове значения getParameter. Я также попытался установить setParameterList, но этот метод не был доступен в интерфейсе запросов. Проблема решена теперь после того, как я понизил hibernate до 5.1.0. Исходная версия – lives