QueryDSL中包含通配符的字符串的精确匹配
在我们最近的一个项目中,我们的客户要求一个搜索字段,该字段可以搜索名字,姓氏和电子邮件地址,唯一的通配符是星号“ *”,表示部分匹配。 听起来很简单,但它使我们陷入了混乱。 在我们的项目中,我们将QueryDSL与JPA和MySQL结合使用作为基础关系数据库管理系统。
这意味着默认通配符对于一个字符为'_',对于多个字符为'%'。 支持“ *”进行部分匹配很容易:我们只需在搜索字符串中将“ *”替换为“%”,然后再将其作为值传递给JPA Query LIKE表达式即可。
我们的代码如下所示:
searchText = searchText.replace( "*", "%" );
query.where( user.email.like( searchText ).or(user.firstName.like( searchText ).or(user.lastName.like( searchText ))
) )
在此时搜索firstname_lastname@example.org时,当前查询仍返回两个结果:firstname_lastname@example.org和firstname.lastname@example.org。
当然,'_'通配符需要转义。 但是,事实证明,这并不是那么简单。
根据JPQLTemplates类的定义,默认转义字符为'!'。 这意味着,在搜索字符串替换“_”由“!_” 应该是足够了。
searchText = searchText.replace( "_", "!_" );
searchText = searchText.replace( "*", "%" );
但是,测试表明事实并非如此。 经过一些调试,然后打开SQL日志记录(默认情况下我们将其关闭),我们发现生成的SQL解析为:
SELECT * FROM users WHERE email like 'firstname!!_lastname@example.org' escape '!';
事实证明转义字符本身已被转义。 最初,我们的Google Fu使我们有些失败,但后来从2013年开始偶然发现了GitHub问题 。
显然,只有通过明确说明转义字符才能强制进行实际转义 ,即使它与默认转义字符相同也是如此。
将转义符添加到QueryDSL表达式中解决了我们的问题:
searchText = searchText.replace( "_", "!_" );
searchText = searchText.replace( "*", "%" );
query.where( user.email.like( searchText, '!' ).or(user.firstName.like( searchText, '!' ).or(user.lastName.like( searchText, '!' ))
) )
解决我们想要的SQL:
SELECT * FROM users WHERE email like 'firstname!_lastname@example.org' escape '!';
并生成满足客户要求的搜索结果:firstname_lastname@example.org
这是我们永远不会忘记的!
翻译自: https://www.javacodegeeks.com/2018/06/matching-string-wild-card-querydsl.html
QueryDSL中包含通配符的字符串的精确匹配相关推荐
- java中字符串的精确匹配_Java最佳实践–字符串性能和精确字符串匹配
java中字符串的精确匹配 在使用Java编程语言时,我们将继续讨论与建议的实践有关的系列文章,我们将讨论String性能调优. 我们将专注于如何有效地处理字符串创建, 字符串更改和字符串匹配操作. ...
- SQL语句批量去除、替换掉某列(字段)中包含的某个字符串
原文链接: SQL语句批量去除.替换掉某列(字段)中包含的某个字符串,一并总结下列的增删改操作_Java Punk的博客-CSDN博客_sql删除包含某种字所有信息 以MySQL为例: 以下案例假设 ...
- JavaScript判断字符串中包含另一个字符串(QML 中使用)
前言 为啥会搞JavaScript呢,原因很简单,因为 QML 中用到了 JS 的语法,本来在 Qt 里面 QString 检查字符串是否包含一个子串是非常简单的事情,直接用contains()函数就 ...
- 一个字符串中包含另一个字符串所有字符的最短子串长度?——《编程之美》最短摘要的生成的简化
题目: 给定一个字符串及一个字符串集合A,求该字符串中包含A中所有字符的最短子串长度. 解决方案一: 最直接的方法就是,直接开始遍历:查找任意两个子串之间是否包含str2,如果包含,记录下长度,求得最 ...
- element中组件el-autocomplete远程搜索之精确匹配和模糊匹配
在实际开发项目中总是会遇到很多难以预测的情况, 比如el-autocomplete的远程搜索时,经常会从服务器发起搜索,然后把对象带出的相关值赋给其他标签元素,一般模糊匹配没问题,但是精确匹配会存在一 ...
- C++中如何判断一个字符串中包含另一个字符串
使用find函数封装isContain函数 bool isContain(string str1, string str2){if(str1.find(str2)!=string::npos){ret ...
- Oracle字符串里有单引号,oracle字符串中包含单引号
1.关于在字符串中包含单引号 字符串是引用字符串的,如果字符串本身就包含单引号怎么办? 用2个单引号表示或者以q或Q开头,然后后面是字符串,字符串的第1个字符和最后结束的字符是分割符号,中间的引 ...
- 精确匹配(FIND_IN_SET)
精确匹配(FIND_IN_SET) 相当于模糊查询,但比模糊查询更加精确,例如type=1,2,12,22 用逗号隔开. 需要查type字段中是否包含 数字"2",用like '% ...
- linux 替换文件中某个字符串_word中如何删除包含某个特定字符串的整个段落?...
hello,我是小菜姐姐,今天和大家分享一个粉丝朋友的问题,大概意思就是word中删除包含某个特定字符串的整个段落. 下图是模拟了一份Word文档需求,需要把带答案的段落全部删除. 大家应该明白需求了 ...
最新文章
- 升降压斩波电路matlab,升降压斩波电路matlab仿真.doc
- mysql中如何求字段的个数字_求高手帮小弟解决一下!关于mysql字段中数字提取求和的问题?...
- Android横向ListView功能实现
- php 流量,PHP 流量控制语句的顶替语法
- 技术·融合·治理|众享链网试运行总结暨正式运行发布会预告
- 在线获取今天是今年的第周几
- c语言 软件中断 gcc,不同编译器中断函数的表示方法
- git 创建远程仓库
- Maven下载及安装配置
- 嵌入式linux设计报告,嵌入式Linux程设计报告.doc
- 网站克隆:setoolkit社工软件
- 中国及中国各省矢量地图数据下载
- Java二叉树的完全性检验
- dorado 7 数据库配置
- uni-app的基本使用
- solidworks2014可否保存成以前版本?--问题解决
- 微信小程序(四)会员专区
- (三)Shi-Tomasi角点检测
- 高可用架构之高可用的应用和服务
- 从底层了解ASP.NET体系结构