3

Javaで一重引用符を使用してクエリステートメントを作成するにはどうすればよいですか. 一重引用符で単語を検索すると、表示するレコードが表示されません

たとえば、私は D'costa という名前を持っていますが、Java を使用してこれを検索するにはどうすればよいでしょうか

 getSearchByUserSQL.append("SELECT * FROM SID_USERS  ");
    getSearchByUserSQL.append("WHERE lower(FIRSTNAME) like  ? 
          OR lower(LASTNAME) like  ?");
4

3 に答える 3

4

すべての文字列を手動でエスケープしようとすることはできますが、多くの作業と困難があります (異なる DB には異なるエスケープ ルールがある場合があります)。あなたがそれをすべきではないというさらなる証拠として - apahe commons lang を見てください - 彼らはまさにその理由で 2.* と 3.* の間で SQL をエスケープするためのサポートを打ち切りました。

代わりに、クエリをPreparedStatementにすると、 PreparedStatement.setParameter(int, String)を使用して、プレースホルダーの代わりに動的な値を挿入でき、JDBC ドライバーがすべてのエスケープを行います。それで:

String myQuery = "SELECT * FROM SID_USERS WHERE lower(FIRSTNAME) like :1 OR lower(LASTNAME) like :2";
PreparesStatement ps = connection.prepareStatement(myQuery);
ps.setParameter(1,"Mickey");
ps.setParameter(2,"Mouse");
results = ps.execute();
于 2013-01-15T05:04:46.183 に答える
1

'でエスケープする必要があり\'ます。ここ\にエスケープ文字があります。String.replace
を 使用して に置き換えることができます。'\'

Java のエスケープシーケンス:

\ b    /* \u0008: backspace BS */
\ t    /* \u0009: horizontal tab HT */
\ n    /* \u000a: linefeed LF */
\ f    /* \u000c: form feed FF */
\ r    /* \u000d: carriage return CR */
\ "    /* \u0022: double quote " */
\ '    /* \u0027: single quote ' */
\ \    /* \u005c: backslash \ */

ドキュメントリンク

于 2013-01-15T04:52:40.753 に答える
1

Java では、単一引用符をバックスラッシュでエスケープする必要があります。Oracle の場合は、一重引用符で一重引用符をエスケープする必要があります。トリック\'\'を行う必要があるため、PL/SQLでは、最終的には''になり'ます。

getSearchByUserSQL.append("SELECT * FROM SID_USERS  ");
getSearchByUserSQL.append("WHERE lower(FIRSTNAME) like \'PETE\'\'S\' OR lower(LASTNAME) like \'REPEAT\'\'S\'");

"pete's" と "repeat's" が名として検索されます。PL/SQL文字列内の例のリテラルとして一重引用符を指定するだけです。それは「ストリング・インセプション」と呼ばれる

于 2013-01-15T04:56:39.850 に答える