【问题标题】:how to write JPQL query for similar characters如何为相似字符编写 JPQL 查询
【发布时间】:2016-03-15 12:14:48
【问题描述】:

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

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

但我有一个问题。

实体的“姓氏”值在数据库中是“SAĞLAM”,查询的参数是“SAGLAM”,反之亦然。所以查询没有给出实体。

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

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

【问题讨论】:

    标签: regex hibernate jpa jpql


    【解决方案1】:

    在 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 原始列时的重音符号。这可能是性能的最佳选择。

    【讨论】:

      猜你喜欢
      • 2011-02-20
      • 2021-05-27
      • 2012-05-02
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 2018-09-18
      • 2021-03-23
      • 1970-01-01
      相关资源
      最近更新 更多