8

次のような Hibernate SQL クエリがあります。

public void funcA(String str) {
  StringBuilder sql = new StringBuilder();
  sql.append("select fieldA from tableA where fieldB like '%:searchKey%'");

  ...

  session.createSQLQuery(sql.toString())
  .addScalar("fieldA", StandardBasicTypes.STRING)
  .setParameter("searchKey", str);

  ...
}

このようなクエリを作成すると、query.list()次のエラーが発生しました。

[WARNING ] SQL Error: -7, SQLState: 42601[ERROR   ] The character "%" following "fieldB like" is not valid.
[ERROR   ] An error occurred during implicit system action type "2".  Information returned for the error includes SQLCODE "-7", SQLSTATE "42601" and message tokens "%|fieldB like".

この問題を解決する方法を教えてください。

4

3 に答える 3

17

これはうまくいくはずです:

    public void funcA(String str) {
  StringBuilder sql = new StringBuilder();
  sql.append("select fieldA from tableA where fieldB like :searchKey");

  ...

  session.createSQLQuery(sql.toString())
  .addScalar("fieldA", StandardBasicTypes.STRING)
  .setParameter("searchKey", "%" + str + "%");

  ...
}
于 2012-08-15T10:03:43.080 に答える
4

同じ例で、MatchMode (休止状態のクラス、述語の制限などに対処するため) を使用しました。

 public void funcA(String str) {
  StringBuilder sql = new StringBuilder();
  sql.append("select fieldA from tableA where fieldB like :searchKey");

  ...
  session.createSQLQuery(sql.toString())
  .addScalar("fieldA", StandardBasicTypes.STRING)
  .setParameter("searchKey", MatchMode.ANYWHERE.toMatchString(str));

  ...
}

MatchMode.ANYWHERE.toMatchString(str) : toMatchString メソッドは、値文字列を呼び出し元の列挙型に変換します。

オプション:

  • どこでも: '%' + 値 + '%'
  • END: '%' + 値
  • 開始: 値 + '%'
  • 正確: 値
于 2017-11-06T07:51:06.327 に答える
3

私たちにとってこれは機能します...

    whereCluase += " and lower(" + firstAttribute + ") like ?";
    queryParams.add("%" + value.toLowerCase() + "%");

小さな断片を投稿して申し訳ありません。しかし、これでトラブルから抜け出すには十分なはずです。

EDIT : コメントから、ここで大文字lowertoLowerCase()小文字の区別を実装することです。

于 2012-08-15T09:59:57.640 に答える