java - バインド - sql like エスケープ



SQL Serverの方言を使用してLIKE句の下線をエスケープするようにHibernateを構成する (2)

私はアンダースコアを含むべきLIKE句を持つSQL SELECTクエリを持っています。アンダースコアはワイルドカードとして扱われません。

SELECT * FROM my_table WHERE name LIKE '_H9%';

実際の句を '[_] H9%'に変更することができますが、これは期待通りに動作することを理解していますが、この節がHibernateによって生成されているということです。

このようにすべてのクエリですべてのアンダースコアをエスケープするようにHibernateを設定する方法はありますか? それができない場合、アンダースコアをワイルドカードとして扱わないようにSQL Server(私の場合は2008年)を設定する方法はありますか?


Answer #1

Criteriaを使用してクエリを作成している場合は、 'Character escapeChar'を使用する保護されたコンストラクタの1つを使用してorg.hibernate.criterion.LikeExpressionをサブクラス化し、値を代入する独自の式を作成できます。 仮定して '!' (あなたが好きなものを選ぶことができます、私は推測します)、あなたは単に行うことができます:

public class EscapingLikeExpression extends LikeExpression {
  public EscapingLikeExpression(String propertyName, String value) {
      super(propertyName, escapeString(value), '!', false);
  }

  static String escapeString(String inputString) {
    inputString = inputString.replace("_", "!_");
    return inputString;
  }

}

そのような文字がない場合(リテラルとして検索値に表示されない場合)、エスケープするためにescapeString()の最初の行として以下を追加します。

    inputString = inputString.replace("!", "!!");

Answer #2

なぜあなたは値の文字列の置換を行うことはできませんか? これはどのように使用され、これは実行不可能な解決策ですか?





hibernate