2017-01-03 18 views
0

準備されたステートメントを作成したいJSON列がありますが、ステートメントのパラメーターがリテラル文字列の中にあるため、どのように進むべきかわかりません。例えばJavaでmysqlのJSONデータ型にプリペアドステートメントを使用する方法は?

PreparedStatement stmt = myConn.prepareStatement("SELECT JSON_SET(new_friends, '$.?', '[?]') from friend_list where id = ?"); 

for (int i = 0; i < new_friends.size(); i++) { 
     String friend = new_friends.get(i); 

     // not sure what to put here 
     stmt.set.... 
     stmt.set.... 
     stmt.set(3, i); 
} 

誰もが何か提案がありますか?

+0

私はあなたがJSON_SET関数の引数として文字列を渡すべきだと思っています。それは他の関数と大きく違っています: 'JSON_SET(new_friends、?、?)'。この場合、最初のプレースホルダは '' $ .whatever''の値を渡し、2番目のプレースホルダは '' [1,2,3,4,5] ''の値を渡します。それらは文字列でなければならないことに注意してください。少なくとも試してみてください。 –

+0

MySQLのドキュメントを見てから、利用可能なJSON関連の関数のコレクションがあります。もしあなたが 'JSON_ARRAY_APPEND'を使うことができる配列に新しい値を追加するのであれば。 https://dev.mysql.com/doc/refman/5.7/ja/json-modification-functions.html –

答えて

1

?プレースホルダは文字列補間のようには使用されません。それらはの全体のパラメータを置き換えます。関数の引数が文字列の場合、引数全体はリテラル文字列でなければならず、さらに引数として引数をとるSQL文字列関数で構築する必要があります。

これらを検討し、あなたの構文はあなたが達成したいもののために正しいと仮定すると:

JSON_SET(new_friends, '$.?', '[?]') -- not valid 
JSON_SET(new_friends, ?, ?) -- valid 
JSON_SET(new_friends, CONCAT('$.',?), CONCAT('[',?,']')) -- valid 

パラメータ1は、上記の2行目のスタイルでクエリの文字列$.fooに設定し、またはでfooされるだろう

WHERE username = '?'のようなものを使用できない/使用できない理由は、代わりにWHERE username = ?(引用符は?)です。

+0

ありがとう!私は今これを試してみるつもりです。これは数値にも有効でしょうか? – Edmond

関連する問題