如何为相似字符编写 JPQL 查询



我有一个查询来从数据库中选择类似的实体。

Query query = entityManager.createQuery("select c from Case c where c.lastName = :lastName");

但我有一个问题。

实体的"姓氏"值在数据库中是"SAĞLAM",查询的参数是"SAGLAM",反之亦然。因此,查询不会提供实体。

C/Ç、S/Ş、G/Ğ、O/Ö、U/Ü、I/İ 会出现这种情况。

如何解决这个问题?我可以编写正则表达式吗?

在 JPQL 中你不能这样做...但是使用休眠(HQL),您可以执行以下操作:

select  upper(convert('This is a têst','US7ASCII')),
        upper(convert('THIS is A test','US7ASCII'))
from dual;
select  1 from dual 
where upper(convert('This is a têst','US7ASCII')) =
             upper(convert('THIS is A test','US7ASCII'))

要使用另一个 JPA 实现执行此搜索,您需要使用nativeQuery并选择以下一些选项:

  • SELECT中更改数据库的排序规则,如(SQL Server示例): SELECT e.name FROM Entity e WHERE e.name COLLATE Latin1_General_CI_AI LIKE 'têst' COLLATE Latin1_General_CI_AI
  • 使用数据库的本机函数,例如SOUNDEX
  • 使用数据库的regex功能

如果你真的需要使用JPQL:

  • 在表中创建新列,每次INSERTUPDATE原始列时删除重音符号。这可能是性能的最佳选择。

最新更新