PreparedStatementでワイルドカードを使うときの注意
PreparedStatement でワイルドカードを含んだ
SELECT * FROM ACCOUNT WHERE NAME LIKE '<入力値>%'
というSQLを実行しようと思い、
String sql = "SELECT * FROM ACCOUNT WHERE NAME LIKE '?%'"; PreparedStatement ps = connection.prepareStatement(sql); ps.setString(1, keyword); ResultSet rs = ps.executeQuery();
として実行したら以下のようなエラーが出た。
java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
?はシングルクウォートで囲ってしまうとプレースホルダとしては機能しなくなるそうだ。
正しくは以下のどちらかのようにすればいいらしい。
String sql = "SELECT * FROM ACCOUNT WHERE NAME LIKE ? || '%'"; PreparedStatement ps = connection.prepareStatement(sql); ps.setString(1, keyword); ResultSet rs = ps.executeQuery();
String sql = "SELECT * FROM ACCOUNT WHERE NAME LIKE ?"; PreparedStatement ps = connection.prepareStatement(sql); ps.setString(1, keyword + "%"); ResultSet rs = ps.executeQuery();
実際に試すと後者はうまくいくが前者はダメだった。
MySQLの問題?
参考ページ:
Java: PreparedStatement で like を扱う時の注意点 - sardineの日記
PreparedStatementのLIKE条件 | MOYO Laboratory
« サーブレット・JSPメモ011:DB接続するWEBアプリでリロード時に致命的なエラーが出る | Main | log4jの導入 »
「Java」カテゴリの記事
- 正規表現メモ(2013.10.07)
- Androidアプリ開発メモ068:Tweenアニメーション(2012.11.18)
- Androidアプリ開発メモ067:NDKのサンプルを動かしてみた(2012.09.10)
- JNI その2:ネイティブコードからJavaメソッドを呼び出す(2012.08.29)
- JNI その1:Javaからネイティブコードを呼び出す(2012.08.26)
「MySQL」カテゴリの記事
- MySQLメモ020:INSERT後にAUTO_INCREMENTなカラムの値を取得する方法(PDO編)(2015.02.14)
- MySQLメモ019:TIMESTAMP型の列には勝手にNOT NULL制約とDEFAULT制約が付く(2015.02.12)
- MySQLメモ018:MySQL WorkbenchでTRUNCATEできるようにする(2015.02.11)
- MySQLメモ017:CREATE文、AUTO_INCREMENT、ENGINE(2015.02.08)
- SQLインジェクション その7(2013.10.14)
The comments to this entry are closed.
« サーブレット・JSPメモ011:DB接続するWEBアプリでリロード時に致命的なエラーが出る | Main | log4jの導入 »
Comments