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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:33:19