2009-12-22 1 views
7

내가 예를 들어, 내 쿼리에서 매개 변수를 설정하기 위해 노력하고있어 내 자바 Class는 내가이 매개 변수를 추가하고있을 때JPA setParameter를 함께 처리 할 때 "NOT IN (: PARAM)"

select * from Cars where Cars.color NOT IN (:color_params) 

을 그리고 같은 :

... 
query.setParameter("color_params", "RED,BLUE"); 
... 

그리고이 작동하지 않습니다 만 하나 개의 매개 변수와 함께 일하고있다.
"'RED','BLUE'" 으로 시도했지만 작동하지 않습니다. 내가 쿼리에서 내 매개 변수를 넣으면

예를 들면 노력하고 있습니다 :

select * from Cars where Cars.color NOT IN ('RED','BLUE') 

은 내가 잘못 무슨!?

미리 감사드립니다.

답변

12

목록을 전달해야합니다.

List<String> colors = ....; 
String query = "select * from Cars where Cars.color NOT IN (:color_params)"; 
Map<String, Object> params = new HashMap<String, Object>(); 
params.put("color_params", colors); 
// ... execute the query with the param. 

당신은 할 수 : 일반적으로

query.setParameter("color_params", colors); 

, 종종 대신 문자열을 사용자 정의의 고정 쿼리에 매개 변수를 전달하는 선호한다. 장점은있을 수 :

  1. 분석 감소 : JPA 구현 (적어도 Hibernate가) 각 쿼리를 구문 분석 노력이있다. 따라서 구문 분석 된 쿼리는 캐시로 이동하여 재사용됩니다. 쿼리 문자열이 런타임에 매개 변수에서 빌드되면 두 번 같지 않을 수 있으므로 많은 시간, 컴퓨팅 성능 및 캐시 메모리가 손실됩니다. 그러나 당신이 다른 매개 변수를 가진 동일한 질문 끈을 사용하는 경우에, 빙고 : 빠른, 낮은 기억 사용, 낮은 cpu 필요 조건.
  2. SQL 삽입 방지. 이 보증은 매개 변수를 사용할 경우 제공됩니다. 매개 변수를 사용하여 쿼리 문자열을 작성하는 경우이 보증을 직접 제공해야합니다 ...!
+0

감사합니다 .... 정상적으로 작동합니다! –

+0

KLE : 어디에서이 두 총알을 얻었습니까? –

+1

@Castanho ** 총알 숫자 1과 2 ** 그냥 '1'이라고 씁니다. 새 줄에 빈 줄이옵니다. [숫자는 자동으로 계산되며 '1'을 쓸 수 있습니다. 모든 이들에게 : 위키 스타일]. 질문이나 답변을 작성할 때 오른쪽 열은 많은 옵션을 제공합니다. ;-) – KLE

1

단일 문자열이 아닌 문자열 목록을 전달해야합니다. JPA는 값을 구문 분석하지 않으므로 직접 값을 분할해야합니다.

+0

감사합니다 .... 정상적으로 작동합니다! –

관련 문제