2016-09-26 15 views
0

Я пытаюсь выполнить родной запрос с использованием JPA 2.0.I определили мой родной запрос в orm.xmlParamertized Native Query возвращается пустая [результирующий параметр, как разделенные запятыми строки] (с помощью JPA)

Orm.xml 
    <named-native-query name="getAgencyUsersByRoles"> 
     <query><![CDATA[SELECT DISTINCT a1.USR_LOGIN,c.PERSON_FIRST_NAME,c.PERSON_LAST_NAME,a1.EMAIL, b.auth_role_code FROM USERS a1,PERSON_AUTH_ROLES b,PERSON c WHERE ((b.group_code = 'RCATAG' and a1.person_id=b.person_id and b.person_id=c.person_id AND b.auth_role_code IN (?)) OR (b.group_code = 'RCEMP' and a1.person_id=b.person_id and b.person_id=c.person_id AND b.auth_role_code IN (?))) AND a1.email IS NOT NULL AND a1.status in ('ACTIVE','PASSWORD EXPIRED') ORDER BY a1.usr_login]]></query> 
    </named-native-query> 

Код, из которого я выполняю запрос, используя jpa.

Query query = getEntityManager() 
      .createNamedQuery(NotificationPersistenceConstants.GET_AGENCY_USERS_BY_ROLES); 
    query.setParameter(1, roles); 
    query.setParameter(2, cccRoles); 
    // fetch the results 
    List<Object[]> list = query.getResultList(); 

Этот запрос не бросает любое исключение при исполнении я проверил JPA журналы моего, но приложением с возвращает мне пустой набор результатов.

Когда я запускаю тот же запрос на моем сервере БД, я получаю набор результатов, который доказывает, что у моего запроса нет никаких проблем, а также таблицы содержат записи по этому запросу для возврата.

Я попытался сломать свой собственный запрос и просто выполнить их как отдельные собственные запросы для всех таблиц, которые у меня есть в запросе. Ниже я попытался с предложением DISTINCT проверить, может ли ключевое слово DISTINCT быть виновником. Но все они работали хорошо и дали результат под List<Object[]>

SELECT DISTINCT a1.USR_LOGIN FROM USERS a1 ORDER BY a1.usr_login 
SELECT DISTINCT b.auth_role_code FROM PERSON_AUTH_ROLES b 
SELECT DISTINCT c.PERSON_LAST_NAME FROM PERSON c 

Обновлены роли & cccRoles paramters запросов, которые я передаю в запросе.

roles = 'teller','lender','bacth',etc... // This list is dynamically created at runtime 
cccRoles = 'cccadmin','ccuser',etc // This list is dynamically created at runtime 

Теперь я не уверен, в чем проблема.

Вопрос? - Не должно быть, поскольку я проверил выполнение того же запроса непосредственно на сервере БД и работал хорошо.

EntityManager (JPA)? - Проверяли все конфигурации, а также выполняли отдельные запросы, упомянутые выше, и получили результат.

присоединяется? ...

Пожалуйста, помогите мне, если кто-нибудь сталкивался с такой же вопрос с использованием WAS 8.5, JPA 2.0.

+0

Попытайтесь отследить запросы. F.e .: «изменить события набора сеанса» 10046 контекст имени трассировки навсегда, уровень 12 '; ' –

ответ

1

Хорошо, что я смог развернуть свою проблему и обнаружил, что проблема связана с параметрами, которые я устанавливал для своего объекта Query.

Виновником строки кода:

String roles = 'teller','lender','bacth';// This list is dynamically created at runtime of nth elements 
Strign cccRoles = 'cccadmin','ccuser';// This list is dynamically created at runtime of nth elements 
Query query = getEntityManager().createNamedQuery(NotificationPersistenceConstants.GET_AGENCY_USERS_BY_ROLES); 
query.setParameter(1,roles); 
query.setParameter(1,cccRoles); 

Вот в моем коде выше roles & cccRoles строка становится замещена от одного? заполнители в строке запроса, поэтому, когда запрос был интерпретирован для поиска, вся строка (т. е. «кассир», «кредитор», «bacth») была сопоставлена ​​с указанным столбцом b.auth_role_code против каждой записи db в db, и, следовательно, Не найдено никаких записей.

В то время как, если я хотел бы построить ту же строку запроса в Java с помощью подстановки непосредственно эта строка параметров (roles & cccRoles) в запросе, а затем вызвать createNativeQuery() это что-то вроде работы:

Query query = getEntityManager().createNativeQuery("SELECT DISTINCT a1.USR_LOGIN,c.PERSON_FIRST_NAME,c.PERSON_LAST_NAME,a1.EMAIL, b.auth_role_code FROM USERS a1,PERSON_AUTH_ROLES b,PERSON c WHERE ((b.group_code = 'RCATAG' and a1.person_id=b.person_id and b.person_id=c.person_id AND b.auth_role_code IN ('teller','lender','bacth')) OR (b.group_code = 'RCEMP' and a1.person_id=b.person_id and b.person_id=c.person_id AND b.auth_role_code IN ('cccadmin','ccuser'))) AND a1.email IS NOT NULL AND a1.status in ('ACTIVE','PASSWORD EXPIRED') ORDER BY a1.usr_login"); 

BottomLine: Всякий раз, когда в запросе sql выполняется условие ?(placeholder) с использованием setParameter в объекте Query, оно отображается как одно значение столбца, даже если переданная строка параметра разделяется запятой.

Но когда один и тот же запрос построен в java, путем объединения строки параметра напрямую (без использования setParameter), а затем выполняется, он работает и рассматривает его как список строк для поиска.

Возможные решения таких ситуаций:

  • Replace и построить полный запрос конкатенации весь такой динамический список строк Params (без использования setParameter()) анс исполняют с помощью createNativeQuery()
  • использовать критерии Builder API. поставщика JPA и построить запрос, а затем выполнить. (Рекомендуется)
  • Строгое требование №. от ?(placeholders), основанный на размере нашего списка, а затем называть эквивалентный номер. setParameters в цикле.

  • ?? (Кто-нибудь имеет какие-либо другие лучшее решение для такой ситуации плз помочь.)

Хотя я все еще пытаюсь получить ответ на вопрос, в чем разница между созданием той же строки запроса во время выполнения в Java и вызов createNativeQuery против, когда Я устанавливаю параметры запроса с помощью query.setParameter().

0

Возможно, это связано с тем, что вы передаете конкатенированные параметры 'teller','lender','bacth' в одном параметре и, следовательно, сравниваются как один параметр строки в jpa. Следовательно, он не возвращает никаких результатов.