2016-09-26 11 views
0

내가 JPA 2.0.I를 사용하여 기본 쿼리를 실행하려고는 orm.xmlParamertized 기본 쿼리 [쉼표로 구분 된 문자열로 매개 변수] 빈 결과 집합을 반환 (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(); 

이 쿼리는 내 appplication의 JPA 로그를 확인 실행하는 동안 예외를 throw하지만 나에게 빈 결과 집합을 반환하지 않습니다.

내 DB 서버에서 동일한 쿼리를 실행하면 쿼리에 아무런 문제가 없다는 것을 증명하는 결과 집합을 얻고이 쿼리에 대한 레코드가 반환됩니다.

내 기본 쿼리를 중단하고 쿼리에있는 모든 테이블에 대해 별도의 네이티브 쿼리로 실행하려고했습니다. 다음은 DISTINCT 절이 범인이 될 수 있는지 확인하기 위해 DISTINCT 절과 함께 시도한 것입니다. 그러나 그들은 모두 좋은 일을 내가 쿼리를 전달하고있는 역할 & cccRoles 쿼리 paramters 업데이트 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 

에서 결과를 주었다.

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

이제는 어떤 문제인지 잘 모르겠습니다.

검색어? - DB 서버에서 직접 동일한 쿼리를 실행하여 제대로 작동하는지 확인해야합니다.

EntityManager (JPA)? - 모든 구성을 확인하고 위에서 언급 한 개별 쿼리를 실행하고 결과를 다시 얻습니다.

사람은 8.5, JPA 2.0 WAS를 사용하여 동일한 문제가 발생하는 경우

이 제발 도와주세요 ...? 결합합니다.

+0

쿼리를 추적하십시오. 예 :'세션 설정 이벤트 변경 '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 문자열은 하나에 대해 대체지고? 쿼리 문자열에서 자리 표시자를 찾았으므로 쿼리가 해석되어 전체 문자열 (예 : 'teller', 'lender', 'bacth')이 db의 각 db 레코드에 대해 언급 된 열 b.auth_role_code과 일치했기 때문에 didn 그것에 대한 어떤 기록도 찾지 못했습니다.

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"); 

최하위 : 나는 createNativeQuery()를 쿼리에서 직접이 문자열 매개 변수 (roles & cccRoles)을 대체하여 자바에서 같은 쿼리 문자열을 구축하고 전화를 할 경우 같은 뭔가를 작동 반면

: ?(placeholder)의 하위 분할은 을 사용하는 SQL 쿼리에서 Query 개체가 발견 될 때마다 전달 된 매개 변수 문자열이 쉼표로 구분되어 있어도 단일 열 값으로 매핑됩니다.

그러나 매개 변수 문자열을 직접 (setParameter를 사용하지 않고) 연결하여 동일한 쿼리를 java에서 빌드 한 다음 실행하면 작동하고이를 찾을 문자열 목록으로 간주합니다. 이러한 상황에

가능한 해결책 :

  • 교체 및 문자열 PARAMS의 모든 동적 목록을 연결 전체 쿼리를 작성 (setParameter()를 사용하지 않고) ANS 사용을 createNativeQuery()
  • [기준 빌더 API를 사용하여 실행합니다. JPA 공급자의 쿼리를 작성한 다음 실행하십시오. (권장)
  • 빌드 필요 없음. 목록의 크기를 기준으로 ?(placeholders)을 입력 한 다음 해당 번호를 호출하십시오. 루프 내의 setParameters의

  • ?? (사람은 상황 PLZ 도움에 다른 더 나은 솔루션을 제공합니다.)

난 아직도 때 대 createNativeQuery을 자바 런타임에 동일한 쿼리 문자열을 구축하고 호출의 차이점은 무엇에 관한 답을 얻으려고 노력하지만 query.setParameter()를 사용하여 쿼리 매개 변수를 설정합니다.

0

이것은 연결된 매개 변수 'teller','lender','bacth'을 단일 매개 변수로 전달하므로 jpa에서 단일 문자열 매개 변수로 비교되기 때문일 수 있습니다. 따라서 결과를 반환하지 않습니다.