【问题标题】:How to do Hibernate query using like and %?如何使用 like 和 % 进行 Hibernate 查询?
【发布时间】:2012-08-11 15:03:28
【问题描述】:

我有一个这样的 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".

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

【问题讨论】:

    标签: java sql hibernate


    【解决方案1】:

    在同一个示例中,我使用了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: '%' + 值
    • 开始:值 + '%'
    • 精确:值

    【讨论】:

      【解决方案2】:

      对我们来说这是可行的......

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

      很抱歉发布了一个小sn-p。但这应该足以让您摆脱困境。

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

      【讨论】:

      • +1 注意所有lower()/toLowerCase() 只是一个示例,如何不区分大小写。在这种情况下没有必要。
      【解决方案3】:

      这应该可行:

          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 是。
      • 以上代码对我不起作用。还有其他选择吗?
      猜你喜欢
      • 2013-12-26
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 2015-09-29
      • 2017-03-19
      相关资源
      最近更新 更多