문제

예를 들어 쿼리에서 매개 변수를 설정하려고합니다.

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

일반적으로 문자열을 사용자 정의하는 대신 매개 변수를 고정 쿼리로 전달하는 것이 좋습니다. 장점은 다음과 같습니다.

  1. 구문 분석 감소: JPA 구현 (적어도 최대 최대 절전 모드)은 각 쿼리를 구문 분석하는 데 어려움을 겪고 있습니다. 따라서 구문 분석 된 쿼리는 캐시로 들어가서 재사용됩니다. 쿼리 문자열이 매개 변수에서 런타임에 빌드되면 두 배나 동일하지 않을 수 있으므로 많은 시간, 컴퓨팅 전원 및 캐시 메모리가 손실됩니다. 그러나 매개 변수가 다른 동일한 쿼리 문자열을 사용하는 경우 Bingo : 빠르고 낮은 메모리 사용, 낮은 CPU 요구 사항.
  2. SQL 주입을 방지하십시오. 이 보증은 매개 변수를 사용하는 경우 제공됩니다. 매개 변수로 쿼리 문자열을 빌드하면이 보증을 스스로 제공해야합니다 ...!

다른 팁

단일 문자열이 아닌 문자열 목록을 전달해야합니다. JPA는 귀하의 가치를 구문 분석하지 않으며 직접 분할해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top