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

时间:2016-03-15 12:14:49

标签: regex hibernate jpa jpql

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

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

但我有一个问题。

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

C /Ç,S /Ş,G /Ğ,O /Ö,U /Ü,I /İ的情况发生。

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

1 个答案:

答案 0 :(得分:2)

在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:

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