2012-08-15 50 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:值