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

时间:2012-08-15 09:52:23

标签: java sql hibernate

我有一个像这样的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 个答案:

答案 0 :(得分:12)

这应该有效:

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

  ...
}

答案 1 :(得分:3)

对我们来说这是有效的......

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

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

编辑:来自评论,lowertoLowerCase()是为了在此处实施案例敏感性。

答案 2 :(得分:3)

在同一个例子中,我使用了MatchMode(hibernate类,来处理谓词限制)。

 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:'%'+ value
  • START:value +'%'
  • EXACT:value