如何为相似字符编写 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 中创建一个新列,每次
INSERT
或 UPDATE
原始列时删除重音符号。这可能是性能的最佳选择。
我有一个查询 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 中创建一个新列,每次
INSERT
或UPDATE
原始列时删除重音符号。这可能是性能的最佳选择。