2012-08-15 53 views
5

我有一个休眠的SQL查询是这样的:如何使用like和%来做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", 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". 

我可以知道我怎么能解决这个问题?

回答

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

    ... 
} 
+0

如果fieldA是长整型还是非整型?然后休眠不喜欢字符串。我仍然想做一个“模糊”匹配(即包含使用%%),但列是一个长。 Mysql查询很好,但它似乎并不像冬眠。 – 2016-04-11 16:39:06

3

对我们来说,这个工程......

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

对不起张贴一个小片段。但这应该足以让你摆脱困境。

编辑:从评论,lowertoLowerCase()这里是实现情况下的敏感性。

+0

+1注意全部e'lower()'/'toLowerCase()'只是一个示例,如何匹配不区分大小写。在这种情况下没有必要。 – 2012-08-15 10:01:42

2

在同一个例子,我已经使用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 method converts the value string to enum from which it is called.

选项:

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