gpt4 book ai didi

java - Hibernate:不区分大小写的搜索不适用于特殊字符

转载 作者:行者123 更新时间:2023-11-29 12:18:53 27 4
gpt4 key购买 nike

我有一个搜索 HQL 查询:

@NamedQuery(name = "Recipe.findByTitle", query = "SELECT r.title FROM Recipe r WHERE UPPER(r.title) LIKE :titlePart")

在数据库中,我有以下值:Heiße Suppe
由于不区分大小写的搜索,我也需要在 Java 中将输入字符串设置为大写。我尝试通过传递字符 eiße 来搜索此条目:

language = "de";
characters = "eiße";
queryTitle.setParameter("titlePart", "%" + characters.toUpperCase(new Locale(language)) + "%");

预计由于德语语言环境,Java 会将升号 s ('ß') 转换为 SS。这有效(尽管它甚至适用于 Locale.ENGLISH,但这是另一个问题)。然而,问题是 HQL 的 UPPER 没有将尖锐的 s 'ß' 转换为 SS,这就是它这样做的原因不返回任何结果。我不确定 hibernate 在 UPPER 中使用特殊字符做什么,但这与 Java 所做的不同。 (它仅适用于非特殊字符)。
对于这种情况,一种解决方案是将两者都设置为小写,但我怀疑这是否适用于世界上所有具有特殊字符的语言,或者是否始终对任何语言使用 toLowerCase 的解决方案?

[更新]
我仍然不确定这是否适用于所有语言,但我用希腊语值进行了一些测试。我将希腊大写字母 alpha 到 gamma (ΑβΓΔ) 插入数据库,然后搜索小写字母 alpha 到 gamma (αβγδ),结果找到了。也许这是降低值的常用方法,因为数据库会适本地降低值。我只是想知道这是否适用于任何语言。

最佳答案

您可以尝试使用 ILIKE:

query = "SELECT r.title FROM Recipe r WHERE r.title ILIKE ('%' || :titlePart || '%')"

或在 Hibernate 中对两个部分进行大小写转换:

query = "SELECT r.title FROM Recipe r WHERE UPPER(r.title) LIKE ('%' || UPPER(:titlePart) || '%')"

在哪里

queryTitle.setParameter("titlePart", characters);

我不建议在 Java 中转换大小写 - 它会导致难以调查错误...

关于java - Hibernate:不区分大小写的搜索不适用于特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37768296/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com