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
相关产品推荐
相关产品推荐

