programing

쿼리라는 JPA의 IN 절에서 동적 매개 변수를 사용하는 방법은 무엇입니까?

itmemos 2023. 7. 6. 21:51
반응형

쿼리라는 JPA의 IN 절에서 동적 매개 변수를 사용하는 방법은 무엇입니까?

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

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

이전 코드는 Sql Developer 내에서 잘 작동합니다.동일한 정적 쿼리도 잘 작동하며 몇 가지 결과를 반환합니다.

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

저는 결국 괄호를 쿼리 대신 매개 변수에 직접 설정하려고 했지만, 이것도 작동하지 않았습니다...

첫 번째 (작업 중인) 사례와 일치하도록 런타임에 쿼리를 작성할 수 있지만, 적절한 방법으로 수행할 것입니다. 따라서, 아이디어가 있는 사람이 있다면, 저는 그것들을 매우 흥미롭게 읽을 것입니다!

참고로 JPA 버전 1.0 Oracle 11G

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

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

Oracle용 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();

다음 대신:

nativeQuery.setParameter("selectedValues", params);

다음을 사용해야 했습니다.

nativeQuery.setParameterList("selectedValues", params);

이것은 더비에서 저에게 효과가 있었습니다. 매개 변수는 "" 없이.

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

대체:

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

와 함께

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

저도 같은 문제에 직면했습니다.
제가 한 일은 이렇습니다.

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

그리고 이제 당신은 샘플을 설정할 수 있습니다.params.

언급URL : https://stackoverflow.com/questions/21484176/how-to-use-a-dynamic-parameter-in-a-in-clause-of-a-jpa-named-query

반응형