2016-03-15 60 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去除重音原始專欄。這可能是性能的最佳選擇。