如何使用like和%进行Hibernate查询?

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".

请问我该如何解决这个问题?

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 + "%");

  ...
}

如果fieldA是Long类型或非字符串类型怎么办?那么Hibernate就无法处理这个字符串。我仍然想进行“模糊”匹配(即使用%%包含),但该列是Long类型。MySQL查询可以处理,但似乎Hibernate不行。 - Daniel Patrick
以上代码对我来说无法工作。有其他的替代方案吗? - charmi

5
在同一个例子中,我使用了Hibernate的MatchMode类来处理像预测限制那样的问题。请注意保留HTML标记。
 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方法将值字符串转换为调用它的枚举。

选项:

  • ANYWHERE:'%' + 值 + '%'
  • END:'%' + 值
  • START:值 + '%'
  • EXACT:值

3
对我们来说,这很有效...
    whereCluase += " and lower(" + firstAttribute + ") like ?";
    queryParams.add("%" + value.toLowerCase() + "%");

很抱歉只提供了一小段代码。但这应该足以帮您解决问题。

编辑: 根据评论,使用 lowertoLowerCase() 来实现这里的大小写不敏感。


+1 注意所有的 lower()/toLowerCase() 只是一个忽略大小写匹配的示例。在这种情况下不是必需的。 - Aaron Digulla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接