奇妙なバグのトラブルシューティングに役立つ必要があります。 LIKE句とワイルドカードとして "%"を使用する簡単な検索画面で、Oracle 12とEclipselink 2.5.2上で動作するアプリケーションがあります。Eclipselink LIKEクエリで予期しないエスケープが発生する
アプリケーションは、条件ビルダを使用してクエリを作成します。 QAテスト担当者は、検索画面に "_"アンダースコア文字のみを入力しました。アプリケーションコードは、ユーザー指定のテキストを '%'文字でラップします。予想外に(少なくとも私にとって)のEclipseLinkは、「_」文字をエスケープすることを決定しました
bind => [%\_%, ACTIVE, IT, 20, 0]
意味を次のようにクエリパラメータがバインドされてプリペアドステートメントを実行する実行時
new StringBuilder("%").append(param).append("%").toString()
、先頭に "\"を付けます。データベースはOracle 12です。結果のクエリに "ESCAPE '\'"という接尾辞が付くことを期待しますが、これは起こらず、エスケープ句がないと「\ _」がそのまま処理されるため、クエリは何も返しません元のユーザー検索文字列。
私には何が欠けていますか?
かなり奇妙ですが、これはOracle 10 e EclipseLink 2.3.2では発生しません。 httpトラフィックが見えるように見ましたか? – GionJh
実際に渡された内容を確認するために、Oracleの機能/ロギングを介して呼び出されたSQLを調べてください –
コードをチェックし、StringBuilderから構築された結果の文字列と 'param'を出力しますが、特に、パラメータバインディングを使用している場合は、これを指示してください。構築している実際のクエリと式を表示します。 – Chris