如何编写相似字符的 JPQL 查询

Erk*_*rol 5 regex hibernate jpa jpql

我有一个查询从数据库中选择类似的实体。

\n\n
Query query = entityManager.createQuery("select c from Case c where c.lastName = :lastName");\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我有一个问题。

\n\n

数据库中实体的“lastname”值为“SA\xc4\x9eLAM”,查询的参数为“SAGLAM”,反之亦然。所以查询没有给出实体。

\n\n

这种情况发生在 C/\xc3\x87、S/\xc5\x9e、G/\xc4\x9e、O/\xc3\x96、U/\xc3\x9c、I/\xc4\xb0 中。

\n\n

我怎么解决这个问题?我可以写一个正则表达式吗?

\n

Dhe*_*rik 2

在 JPQL 中你不能这样做......但是使用 hibernate (HQL),你可以这样做

\n\n
select  upper(convert(\'This is a t\xc3\xaast\',\'US7ASCII\')),\n        upper(convert(\'THIS is A test\',\'US7ASCII\'))\nfrom dual;\n\nselect  1 from dual \nwhere upper(convert(\'This is a t\xc3\xaast\',\'US7ASCII\')) =\n             upper(convert(\'THIS is A test\',\'US7ASCII\'))\n
Run Code Online (Sandbox Code Playgroud)\n\n

要使用另一个 JPA 实现执行此搜索,您将需要使用nativeQuery并选择以下一些选项:

\n\n
    \n
  • 更改数据库的排序规则SELECT,例如(SQL Server 示例):SELECT e.name FROM Entity e WHERE e.name COLLATE Latin1_General_CI_AI LIKE \'t\xc3\xaast\' COLLATE Latin1_General_CI_AI
  • \n
  • 使用数据库的本机函数,例如SOUNDEX
  • \n
  • 使用regex你的数据库的功能
  • \n
\n\n

如果您确实需要使用 JPQL:

\n\n
    \n
  • 在表中创建一个新列,每次删除原始列INSERT时都删除重音符号。UPDATE也许这是性能的最佳选择。
  • \n
\n