2016-03-15 16 views
4

我有一个查询从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 /İ。

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

回答

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去除重音原始专栏。这可能是性能的最佳选择。