복붙노트

[SQL] 어떻게 JPA 명명 된 쿼리의 IN 절에서 동적 매개 변수를 사용하는 방법?

SQL

어떻게 JPA 명명 된 쿼리의 IN 절에서 동적 매개 변수를 사용하는 방법?

내 문제는 이런 종류의 질의에 관한 것입니다 :

select * from SOMETABLE where SOMEFIELD in ('STRING1','STRING2');

이전 코드는 SQL 개발자 내에서 잘 작동합니다. 같은 정적 쿼리도 잘 돌아갑니다 나에게 몇 가지 결과를 작동합니다

Query nativeQuery = em.createNativeQuery(thePreviousQuery,new someResultSet());
return nativeQuery.getResultList();

나는이를 매개 변수화 할 때, 나는 문제가 발생합니다.

final String parameterizedQuery = "select * from SOMETABLE where SOMEFIELD in (?selectedValues)";
Query nativeQuery = em.createNativeQuery(parameterizedQuery ,new someResultSet());
nativeQuery.setParameter("selectedValues","'STRING1','STRING2'");
return nativeQuery.getResultList();

나는 어떤 결과 (그러나 콘솔에 오류가) 없어. 내가 로그에서 볼 때, 나는 그런 일을 참조하십시오

select * from SOMETABLE where SOMEFIELD in (?)
bind => [STRING1,STRING2]

이러한 오류, 리드 : (selectedValues) 나는 또한 더 (유사한 결과) 따옴표, 또는 비 정렬 매개 변수를 사용하지하려고 :

SQL Error: Missing IN or OUT parameter at index:: 1

나는 enventually 대신 쿼리의 매개 변수에 직접 설정 한 괄호를했다려고했는데,이 중 하나가 작동하지 않았다 ...

내가 처음 (작업)의 경우에 맞게, 런타임시 내 쿼리를 만들 수 있지만 오히려 그것을 적절한 방법을 할 것; 누구든지 아이디어가있는 경우 따라서, 나는 큰 관심을 읽을 수 있습니다!

참고 : JPA 버전 1.0 오라클 11G

해결법

  1. ==============================

    1.JPA는하지 네이티브 쿼리 만 JPQL 쿼리의 목록 문자를 매개 변수로 컬렉션의 사용을 지원합니다. 일부 JPA 제공 업체는 독점적 인 기능으로이를 지원하지만 (https://stackoverflow.com/a/3145275/1285097 참조) JPA 사양의 일부가 아니다.

    JPA는하지 네이티브 쿼리 만 JPQL 쿼리의 목록 문자를 매개 변수로 컬렉션의 사용을 지원합니다. 일부 JPA 제공 업체는 독점적 인 기능으로이를 지원하지만 (https://stackoverflow.com/a/3145275/1285097 참조) JPA 사양의 일부가 아니다.

    기본 쿼리에 명명 된 매개 변수도 JPA 사양의 일부가 아닙니다. 그들의 동작은 지속성 공급자 및 / 또는 JDBC 드라이버에 따라 달라집니다.

    오라클은 이러한 기능을 모두 지원하기위한 JDBC 드라이버를 사용하여 최대 절전 모드.

    List<String> selectedValues = Arrays.asList("STRING1", "STRING2");
    final String parameterizedQuery = "select * from SOMETABLE where SOMEFIELD in (:selectedValues)";
    return em.createNativeQuery(parameterizedQuery)
             .setParameter("selectedValues", selectedValues)
             .getResultList();
    
  2. ==============================

    2.대신에:

    대신에:

    nativeQuery.setParameter("selectedValues", params);
    

    내가 사용했다 :

    nativeQuery.setParameterList("selectedValues", params);
    
  3. ==============================

    3.이 교체 :

    이 교체 :

    nativeQuery.setParameter("selectedValues","'STRING1','STRING2'");
    

    List<String> params;
    nativeQuery.setParameter("selectedValues",params);
    
  4. ==============================

    4.이 더비에서 날 위해 일했습니다. 없는 매개 변수 "()".

    이 더비에서 날 위해 일했습니다. 없는 매개 변수 "()".

    List<String> selectedValues = Arrays.asList("STRING1", "STRING2");
    final String parameterizedQuery = "select * from SOMETABLE where SOMEFIELD in 
    :selectedValues";
    return em.createNativeQuery(parameterizedQuery)
             .setParameter("selectedValues", selectedValues)
             .getResultList();
    
  5. ==============================

    5.나는 또한 같은 문제에 직면했다. 이것은 내가 한 것입니다 :

    나는 또한 같은 문제에 직면했다. 이것은 내가 한 것입니다 :

    List<String> sample = new ArrayList<String>();
    sample.add("sample1");
    sample.add("sample2");
    

    그리고 지금 당신은 PARAMS에서 샘플을 설정할 수 있습니다.

  6. from https://stackoverflow.com/questions/21484176/how-to-use-a-dynamic-parameter-in-a-in-clause-of-a-jpa-named-query by cc-by-sa and MIT license