我有一个查询来从数据库中选择类似的实体。
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:
- 在表中创建新列,每次
INSERT
或UPDATE
原始列时删除重音符号。这可能是性能的最佳选择。