2017-03-27 22 views
0

同じデータをクエリしようとしています。 しかし、preparedStatementは、ドキュメントが言ったようにインデックスが1から始まっても間違ったインデックス作成についてSQLExceptionをスローしました。ここでPreparedStatementを使用したカラムインデックスが無効

は関数である。

public List<Paper1> search(String keyword) throws NotConnectedException { 

    List<Paper1> papers = new ArrayList<>(); 

    try { 
     PreparedStatement searchKeyword = 
     connection.prepareStatement("SELECT title, registered FROM paper " 
     + "WHERE title LIKE '%?%'"); 
     searchKeyword.setString(1, keyword); 
     ResultSet rs = searchKeyword.executeQuery(); 

     while (rs.next()) { 
      Paper1 p = new Paper1(); 
      p.setTitle(rs.getString("title")); 
      p.setRegistered(rs.getDate("registered").toLocalDate()); 
      papers.add(p); 
     } 
     return papers; 
    } catch (SQLException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

SQLExceptionが間違ったラインが

答えて

1

あなたの疑問符のプレースホルダーは一重引用符で囲まれているため、リテラル文字と見なされます。プレースホルダではありません。文が解析されるとき、'%?%'は単なる文字列であり、バインド変数は見られないので、バインド変数は設定できません。変数はないため、インデックス1の変数はありません。

連結を使用して、

PreparedStatement searchKeyword = 
    connection.prepareStatement("SELECT title, registered FROM paper " 
    + "WHERE title LIKE '%' || ? || '%'"); 
+0

ありがとうアレックス!今、私は一重引用符が何をすることができるか理解しています。 –

0

がそれを実行する前に、クエリ文字列をプリントアウトので、間違った列インデックスの

searchKeyword.setString(1, keyword); 

である、と述べました:

SELECT title, registered FROM paperWHERE title LIKE '%?%' 

答えは明らかです。

キーワードを区切るにはスペースが必要です。

+0

申し訳ありませんが、以前はスペースの問題が見つかりましたが、問題で解決しませんでした。私はすぐにそれを修正します。まだsqllceptionをスローする –

関連する問題