2017-02-05 3 views
0

В нашем проекте есть требование изменить сгенерированный запрос перед его запуском.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. Будет ли это проблемой? Если это не список?

+0

Вы пробовали проверить 'ли obj' является' экземпляр Collection' и если это так, вызов '# setparameterList' вместо' # setParameter' или является ошибкой, исходящей от вызова '# getParameterValue'? – Naros

+0

Ошибка при вызове значения getParameter. Я также попытался установить setParameterList, но этот метод не был доступен в интерфейсе запросов. Проблема решена теперь после того, как я понизил hibernate до 5.1.0. Исходная версия – lives

ответ

0

Проблема решена теперь, после перехода на предыдущую версию зимуют в 5.1.0.Final версии

+0

В интерфейс 'Query' было внесено несколько изменений, некоторые из которых необходимы, поскольку 5.2.x включал объединение' hibernate-entitymanager' в 'hibernate-core '. Я бы предложил, если вы видите подобные странности, откройте JIRA, чтобы мы могли взглянуть и проверить, есть ли проблема обратной совместимости или нет. – Naros