"Not In (: param)"을 다룰 때 JPA SetParameter
-
20-09-2019 - |
문제
예를 들어 쿼리에서 매개 변수를 설정하려고합니다.
select * from Cars where Cars.color NOT IN (:color_params)
그리고 내 javaclass에 매개 변수를 추가 할 때 다음과 같습니다.
...
query.setParameter("color_params", "RED,BLUE");
...
그리고 이것은 작동하지 않고 하나의 매개 변수 만.
나는 함께 시도했다 "'RED','BLUE'"
그리고 노력하지 않습니다.
쿼리에 매개 변수를 넣으면 예를 들어 다음과 같이 작동합니다.
select * from Cars where Cars.color NOT IN ('RED','BLUE')
내가 잘못하고있는 일!?
미리 감사드립니다
해결책
당신은 목록을 통과해야합니다.
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);
일반적으로 문자열을 사용자 정의하는 대신 매개 변수를 고정 쿼리로 전달하는 것이 좋습니다. 장점은 다음과 같습니다.
- 구문 분석 감소: JPA 구현 (적어도 최대 최대 절전 모드)은 각 쿼리를 구문 분석하는 데 어려움을 겪고 있습니다. 따라서 구문 분석 된 쿼리는 캐시로 들어가서 재사용됩니다. 쿼리 문자열이 매개 변수에서 런타임에 빌드되면 두 배나 동일하지 않을 수 있으므로 많은 시간, 컴퓨팅 전원 및 캐시 메모리가 손실됩니다. 그러나 매개 변수가 다른 동일한 쿼리 문자열을 사용하는 경우 Bingo : 빠르고 낮은 메모리 사용, 낮은 CPU 요구 사항.
- SQL 주입을 방지하십시오. 이 보증은 매개 변수를 사용하는 경우 제공됩니다. 매개 변수로 쿼리 문자열을 빌드하면이 보증을 스스로 제공해야합니다 ...!
다른 팁
단일 문자열이 아닌 문자열 목록을 전달해야합니다. JPA는 귀하의 가치를 구문 분석하지 않으며 직접 분할해야합니다.
제휴하지 않습니다 StackOverflow