1

私はこれらのようなクエリを持っています

 Query query = session.createQuery("select object from EntityObject object where lower(object.columnName) like lower (E'%\\(test\\)%')");

Query query = session.createQuery("select object from EntityObject object where fts('english',contact.searchColumn,'testing (test)') = true;

バックスラッシュを使用して検索テキストの特殊文字をエスケープしようとしています。また、standard_conforming_strings を on 状態にして postgres 8.3 を使用しています。「E」を使用すると、エラーが発生します

予期しないトークン: '%\(test\)%' 最初のケースの 1 行目付近

次のケースのエラーを下回る

エラー: tsquery の構文エラー: "testing (test)"

この問題を解決するのを手伝ってください。私の意図は、特殊文字、特に括弧「()」をバックスラッシュでエスケープすることです。

4

1 に答える 1

3

この関数lowerは、パラメーターとして文字列を想定しています。は先頭にE'%\\(test\\)%'シングルがないため、有効な文字列ではありません。正しい文字列になります-それで何をしたいのだろうかと思いましたが、HQLでもSQLでも正しくエスケープされていません。''E%\\(test\\)%'

likeステートメントには、2 つの特殊なワイルドカード文字_%. それらをエスケープしたい場合は、エスケープ文字を定義する必要があります。

例: 名前がアンダースコアで始まるすべての行を選択する_

from YourTable where name like '!_%' escape '!'

また、(ステートメント'だけでなく) SQLの任意の場所をエスケープする場合は、2 回入力する必要があります。like

例: 名前が次の行を選択します。Peter's

from YourTable where name = 'Peter''s'
于 2013-04-30T07:36:57.923 に答える