在我们最近的一个项目中,我们的客户要求一个搜索字段,该字段可以搜索名字,姓氏和电子邮件地址,唯一的通配符是星号“ *”,表示部分匹配。 听起来很简单,但它使我们陷入了混乱。 在我们的项目中,我们将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中包含通配符的字符串的精确匹配相关推荐

  1. java中字符串的精确匹配_Java最佳实践–字符串性能和精确字符串匹配

    java中字符串的精确匹配 在使用Java编程语言时,我们将继续讨论与建议的实践有关的系列文章,我们将讨论String性能调优. 我们将专注于如何有效地处理字符串创建, 字符串更改和字符串匹配操作. ...

  2. SQL语句批量去除、替换掉某列(字段)中包含的某个字符串

    原文链接: SQL语句批量去除.替换掉某列(字段)中包含的某个字符串,一并总结下列的增删改操作_Java Punk的博客-CSDN博客_sql删除包含某种字所有信息 以MySQL为例: 以下案例假设 ...

  3. JavaScript判断字符串中包含另一个字符串(QML 中使用)

    前言 为啥会搞JavaScript呢,原因很简单,因为 QML 中用到了 JS 的语法,本来在 Qt 里面 QString 检查字符串是否包含一个子串是非常简单的事情,直接用contains()函数就 ...

  4. 一个字符串中包含另一个字符串所有字符的最短子串长度?——《编程之美》最短摘要的生成的简化

    题目: 给定一个字符串及一个字符串集合A,求该字符串中包含A中所有字符的最短子串长度. 解决方案一: 最直接的方法就是,直接开始遍历:查找任意两个子串之间是否包含str2,如果包含,记录下长度,求得最 ...

  5. element中组件el-autocomplete远程搜索之精确匹配和模糊匹配

    在实际开发项目中总是会遇到很多难以预测的情况, 比如el-autocomplete的远程搜索时,经常会从服务器发起搜索,然后把对象带出的相关值赋给其他标签元素,一般模糊匹配没问题,但是精确匹配会存在一 ...

  6. C++中如何判断一个字符串中包含另一个字符串

    使用find函数封装isContain函数 bool isContain(string str1, string str2){if(str1.find(str2)!=string::npos){ret ...

  7. Oracle字符串里有单引号,oracle字符串中包含单引号

    1.关于在字符串中包含单引号    字符串是引用字符串的,如果字符串本身就包含单引号怎么办? 用2个单引号表示或者以q或Q开头,然后后面是字符串,字符串的第1个字符和最后结束的字符是分割符号,中间的引 ...

  8. 精确匹配(FIND_IN_SET)

    精确匹配(FIND_IN_SET) 相当于模糊查询,但比模糊查询更加精确,例如type=1,2,12,22 用逗号隔开. 需要查type字段中是否包含 数字"2",用like '% ...

  9. linux 替换文件中某个字符串_word中如何删除包含某个特定字符串的整个段落?...

    hello,我是小菜姐姐,今天和大家分享一个粉丝朋友的问题,大概意思就是word中删除包含某个特定字符串的整个段落. 下图是模拟了一份Word文档需求,需要把带答案的段落全部删除. 大家应该明白需求了 ...

最新文章

  1. 升降压斩波电路matlab,升降压斩波电路matlab仿真.doc
  2. mysql中如何求字段的个数字_求高手帮小弟解决一下!关于mysql字段中数字提取求和的问题?...
  3. Android横向ListView功能实现
  4. php 流量,PHP 流量控制语句的顶替语法
  5. 技术·融合·治理|众享链网试运行总结暨正式运行发布会预告
  6. 在线获取今天是今年的第周几
  7. c语言 软件中断 gcc,不同编译器中断函数的表示方法
  8. git 创建远程仓库
  9. Maven下载及安装配置
  10. 嵌入式linux设计报告,嵌入式Linux程设计报告.doc
  11. 网站克隆:setoolkit社工软件
  12. 中国及中国各省矢量地图数据下载
  13. Java二叉树的完全性检验
  14. dorado 7 数据库配置
  15. uni-app的基本使用
  16. solidworks2014可否保存成以前版本?--问题解决
  17. 微信小程序(四)会员专区
  18. (三)Shi-Tomasi角点检测
  19. 高可用架构之高可用的应用和服务
  20. 从底层了解ASP.NET体系结构

热门文章

  1. HDU5874 - Friends and Enemies
  2. CERC2017 Gambling Guide,最短路变形,期望dp
  3. 汇编语言(十三)之偶数转成哥德巴赫猜想
  4. Mybatis传入参数类型为Map
  5. Ehcache介绍及整合Spring实现高速缓存
  6. 09-一对多关系建表
  7. Ajax基本案例详解之$.getjson的实现
  8. Struts文件上传与下载详解_上传单个文件
  9. Hibernate中使用Criteria查询及注解——(HibernateUtil)
  10. 涨知识 | 100个中国最难读的地名,第一个就折了