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 方法将值字符串转换为从中调用它的枚举。

选项:

  • 任何地方:'%' + 值 + '%'
  • 结束:“%”+ 值
  • 开始:值 + '%'
  • 精确:值
于 2017-11-06T07:51:06.327 回答
3

对我们来说,这有效...

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

很抱歉发布了一个小片段。但这应该足以让你摆脱困境。

编辑:来自评论,lowertoLowerCase()在这里实现区分大小写。

于 2012-08-15T09:59:57.640 回答