You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hibernate Criteria中添加sqlRestriction实现trim字段匹配时出现SQL语法错误求助

Hibernate Criteria中添加sqlRestriction实现trim字段匹配时出现SQL语法错误求助

嘿,我帮你排查下这个问题!你现在遇到的SQL语法错误,核心原因是你直接把参数硬拼进sqlRestriction的语句里,既没给字符串匹配的%和值加单引号,还存在SQL注入风险,Hibernate生成的SQL自然会语法报错。

咱们先看你原来的代码问题:
你写的Restrictions.sqlRestriction("trim(" + alias + "bar) like %" + filter.getBar()),最后生成的条件是trim(this.bar) like %2,在SQL语法里,字符串匹配的条件必须用单引号包裹,比如trim(this.bar) like '%2%',没有单引号的话数据库根本识别不了这个匹配规则,所以才会报“unknown token”的语法错误。

给你两个靠谱的解决办法,优先选第一个:

  • 方法一:使用参数绑定(推荐,安全又避免语法问题)
    Hibernate的sqlRestriction支持占位符?来绑定参数,还能指定参数类型,这样Hibernate会自动帮你处理单引号的问题,同时还能防止SQL注入:
// 注意这里要导入org.hibernate.type.StringType
criteria.add(Restrictions.sqlRestriction(
    "trim(" + alias + "bar) like ?", 
    "%" + filter.getBar() + "%", 
    StringType.INSTANCE
));
  • 方法二:手动添加单引号(不推荐,有注入风险)
    如果你非要硬拼字符串,那得给%和参数值加上单引号,但如果参数里包含单引号会直接报错,而且容易被SQL注入:
criteria.add(Restrictions.sqlRestriction(
    "trim(" + alias + "bar) like '%"+ filter.getBar() +"%'"
));

最后给你一个修正后的完整代码示例:

public List<FooBarZ> findByFilter(Filter filter) {
 DetachedCriteria criteria = DetachedCriteria.forClass(getPersistentClass());
 String alias = getAlias(criteria); // outputs "this."
    
 criteria.add(eq(alias + "foo", filter.getFoo()));
 // 用参数绑定的正确写法
 criteria.add(Restrictions.sqlRestriction(
     "trim(" + alias + "bar) like ?", 
     "%" + filter.getBar() + "%", 
     StringType.INSTANCE
 ));
    
 return findByCriteria(criteria, 0, filter.getMaxRows());
}

这样修改后,生成的SQL条件会变成trim(this.bar) like '%2%'(假设filter.getBar()的值是2),语法完全合规,就不会再报BadSqlGrammarException了。

备注:内容来源于stack exchange,提问作者Thomarkey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 11:54:53