如何为类似字符编写JPQL查询
问题描述:
我有一个查询从db中选择相似的实体。如何为类似字符编写JPQL查询
Query query = entityManager.createQuery("select c from Case c where c.lastName = :lastName");
但我有一个问题。
实体的'姓'值是数据库中的'SAĞLAM',查询的参数是'SAGLAM',反之亦然。所以查询不会给实体。这种情况发生在C/C,S/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 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
去除重音原始专栏。这可能是性能的最佳选择。