2017-09-28 2 views
0
나는 SQL 쿼리 목록 매개 변수로지도의 키 집합을 사용하려면

이름 :그루비 SQL 목록 매개 변수

query = "select contentid from content where spaceid = :spaceid and title in (:title)" 
sql.eachRow(query, [spaceid: 1234, title: map.keySet().join(',')]) { 
    rs -> 
     println rs.contentid 
} 

내가 하나의 값하지만 설정하거나 목록을 사용할 수 있습니다. 이것은 내가 지금까지 시도한 것입니다 :

map.keySet().join(',') 
map.keySet().toListString() 
map.keySet().toList() 
map.keySet().toString() 

지도는 또한, 나는 오류가 발생하지 않는 키

Map<String, String> map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); 

로 문자열을 사용합니다. 빈 결과 세트처럼 아무것도 인쇄하지 않습니다.

+0

시도하십시오. [SpaceID : 1234, 제목 : " '"+ map.keySet(). join (",'") + " '"]' – injecteer

답변

2

예상 한 결과가 나오지 않습니다. 이것은 당신도 예외뿐만 아니라 어떤 데이터를 얻을 수없는 이유입니다 같은

title = 'value1,value2,value3' 

논리적으로 당신은 술어를 사용하고 있습니다.

빠른 검색은 Groovy SQL에서 콜렉션 a와 IN 목록의 맵핑이 가능하다는 약간의 증거를 제공합니다. herehere

을 확인하십시오. 아마도 적절한 길이로 IN 목록을 정의하고 배열의 값을 할당해야 할 것입니다.

title in (:key1, :key2, :key3) 

어쨌든 이런 일이 잘 작동 :

데이터를

create table content as 
select 1 contentid, 1 spaceid, 'AAA' title from dual union all 
select 2 contentid, 1 spaceid, 'BBB' title from dual union all 
select 3 contentid, 2 spaceid, 'AAA' title from dual; 

그루비 스크립트

map['key1'] = 'AAA' 
map['key2'] = 'BBB' 

query = "select contentid from content where spaceid = :spaceid and title in (${map.keySet().collect{":$it"}.join(',')})" 
println query 
map['spaceid'] = 1 
sql.eachRow(query, map) { 
    rs -> 
     println rs.contentid 
} 

결과

select contentid from content where spaceid = :spaceid and title in (:key1,:key2) 
1 
2 

중요한 단계는 당신은 또한 경우 크기를 확인 할 수 있습니다 dynamicall 트레이스 횟수는 60k 바이트를 map.keySet().collect{":$it"}.join(',')

를 사용 TEH 바인드 변수의 적절한 이름으로 IN 목록을 준비하는 것입니다 하나의 IN 목록에 대한 Oracle 제한 사항 인 1000보다 큰 경우를 매핑하고 처리하십시오.

+0

도와 줘서 고마워! 나는 당신의 솔루션이 나를 위해 작동하도록하기 위해 공백과 대시를 제거하기 위해 추가해야했다 .replaceAll ("\\ s", ""). replaceAll ("-", "") – CaptainMango