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

how to write JPQL query for similar characters

我有一个查询 select 来自数据库的类似实体。

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

但是我有一个问题。

实体的'lastname'在数据库中的值为'SAĞLAM',查询的参数为'SAGLAM',反之亦然。所以查询没有给出实体。

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

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

在 JPQL 中你不能这样做...但是使用 hibernate (HQL),你可以 do this:

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 服务器示例):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:

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