My Photo

« サーブレット・JSPメモ011:DB接続するWEBアプリでリロード時に致命的なエラーが出る | Main | log4jの導入 »

February 19, 2012

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」カテゴリの記事

MySQL」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/54024093

Listed below are links to weblogs that reference PreparedStatementでワイルドカードを使うときの注意:

« サーブレット・JSPメモ011:DB接続するWEBアプリでリロード時に致命的なエラーが出る | Main | log4jの導入 »

May 2017
Sun Mon Tue Wed Thu Fri Sat
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof