2017-09-28 11 views
0

の名前:Groovyの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

試してみてください。 – injecteer

答えて

2

あなたは期待通りの結果を得られません。

論理的にはあなたがそのような

title = 'value1,value2,value3' 

として述語を使用しているこれは、例外なく、データなし何を取得しない理由です。

クイック検索では、Groovy SQLではcollectionaと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; 

の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 
} 

結果

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

重要なステップは、experssion map.keySet().collect{":$it"}.join(',')

を使用してtehのバインド変数の適切な名前でリストを作成しdynamicallすることですまた、場合のサイズをチェックしたい場合があります

1つのINリストのOracleの制限である1000より大きい場合をマップして処理します。

+0

あなたのお手伝いをしてくれてありがとうございます![スペーススペース:1234、タイトル: "'" + map.keySet()。join( "'、" ")+"あなたのソリューションを私のために働かせるために、空白とダッシュをキーから削除するために追加しなければならなかった .replaceAll( "\\ s"、 "")。replaceAll( " - "、 "") – CaptainMango

関連する問題