2017-09-28 4 views
0

Je veux utiliser un keyset d'une carte en tant que paramètre de liste dans une requête SQL:Groovy SQL paramètre de liste nommée

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 
} 

je peux utiliser des valeurs simples mais pas Définit ou listes. C'est ce que je l'ai essayé jusqu'à présent:

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

La carte utilise des chaînes comme la clé

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

Aussi, je ne suis pas une erreur. Je n'ai juste rien d'imprimé comme un ensemble de résultats vide.

+0

try '[spaceid: 1234, title:" '"+ map.keySet(). Join ("', '") +"' "]' – injecteer

Répondre

2

Vous n'apporterez pas le résultat attendu.

Logiquement vous utilisez un prédicat tel que

title = 'value1,value2,value3' 

Ceci est la raison pour laquelle vous obtenez pas exception, mais aussi aucune donnée.

La recherche rapide donne une petite preuve, qu'un mappage d'une collection à une liste IN est possible dans Groovy SQL. S'il vous plaît vérifier here et here

vous donc très probablement à définir la liste IN dans une bonne longueur et affecter les valeurs de votre tableau.

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

Quoi qu'il en soit quelque chose comme ça fonctionne très bien:

données

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; 

Script Groovy

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 
} 

Résultat

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

L'étape clé est de dynamicall préparer la liste IN avec les noms propres de Teh variable de liaison utilisant le experssion map.keySet().collect{":$it"}.join(',')

Remarque

Vous pouvez également vérifier la taille si la mapper et gérer le cas où il est supérieur à 1000, ce qui est une limitation Oracle d'une seule liste IN.

+0

Merci pour votre aide! Je devais ajouter pour supprimer les espaces et les tirets des touches afin de faire fonctionner votre solution pour moi .replaceAll ("\\ s", ""). ReplaceAll ("-", "") – CaptainMango