Spring Data JDBC中Criteria的LIKE忽略大小写及分页问题
Spring Data JDBC Criteria 忽略大小写模糊查询问题处理方案
问题根源
Spring Data JDBC 3.1.0版本中,Criteria.ignoreCase(true)的实现存在缺陷:仅对查询参数执行UPPER()转换,未对数据库表字段做同样处理,导致生成的SQL不符合忽略大小写模糊查询的要求。正确的SQL逻辑应为WHERE UPPER("account_dictionary".account_code) LIKE UPPER(:account_code),但框架生成的SQL只处理了参数,因此只能匹配全大写的QWERTY,无法返回其他大小写混合的目标结果。
手动实现方案(兼容分页)
可以通过自定义Criteria表达式,手动对字段和参数同时做大小写转换,结合JdbcAggregateTemplate实现分页查询:
代码示例1:直接使用表达式
// 构造带通配符的查询参数 String queryParam = "%qwer%"; // 自定义条件,对字段和参数都应用UPPER转换 Criteria criteria = Criteria.where("account_code") .expression("UPPER(account_code) LIKE UPPER(?)", queryParam); // 构建分页请求 Pageable pageable = PageRequest.of(0, 10); // 执行分页查询 Page<AccountDictionary> resultPage = jdbcAggregateTemplate.query(AccountDictionary.class, criteria, pageable);
代码示例2:使用框架function方法
Criteria criteria = Criteria.where("account_code") .function("UPPER", String.class, "account_code") .likeIgnoreCase("%qwer%"); Pageable pageable = PageRequest.of(0, 10); Page<AccountDictionary> resultPage = jdbcAggregateTemplate.query(AccountDictionary.class, criteria, pageable);
以上两种方式都会生成符合预期的SQL,实现类似PostgreSQL ILIKE的忽略大小写模糊查询,且完全兼容分页功能。
版本修复情况
Spring Data Relational 3.2.0及后续版本已修复该缺陷,ignoreCase(true)会同时对表字段和查询参数执行大小写转换,生成正确的SQL逻辑。如果项目允许升级依赖,直接升级到3.2.0及以上版本即可解决问题,无需手动修改代码。
内容的提问来源于stack exchange,提问作者Andrew Bessonov
相关产品推荐
相关产品推荐

