【问题标题】:Is there a jpa or hibernate property to make all queries case insensitive是否有 jpa 或 hibernate 属性使所有查询不区分大小写
【发布时间】:2020-09-06 05:01:54
【问题描述】:

我正在寻找一种优雅的方式来使 jpa hibernate 中的所有查询不区分大小写。底层数据库是Oracle

单独在查询中我们可以这样写

upper(entity.field) = upper(:value) 

or 

Restrictions.eq(entity.field, value).ignoreCase()

有没有一种方法我们不必在每个查询中单独执行此操作,而是在整个会话中处理它

【问题讨论】:

    标签: java oracle hibernate jpa spring-data-jpa


    【解决方案1】:

    TL;DR - 我不知道这样的属性或配置选项,并且有充分的理由说明为什么不能有(见下文)。

    你的问题有点误导。 查询语言 (JPQL) 本身确实不区分大小写。 keywords 查询不仅不区分大小写,而且对于 Java 区分大小写的标识符,它甚至不区分大小写。例如,您可以在同一个 Java 类中拥有 myVarmyvarMYVAR,它们都是不同的实例变量。如果这个类变成了一个 @Entity 并且你用那个实体编写了一个查询,那么对于 JPA 来说,你指的是哪个变量是不明确的。 (虽然没有测试,所以不确定会产生什么样的错误。)

    您实际上似乎想要的是 字符串比较 不区分大小写,这完全是另一回事。这些比较是在数据库端执行的,所以从技术上讲,这取决于数据库如何实现= 运算符。实际上,我不知道任何处理字符串值不区分大小写的关系数据库。

    既然您提到了 Oracle - 在 Oracle 中,标识符 确实不区分大小写(除非引用)并且由数据库自动大写。这是 1980 年代遗留下来的,当时计算机中的大多数文本通常都是大写的(参见 MSDOS、FAT 文件系统、BASIC 编程语言等)。

    但这并不意味着 DB 列中的字符串 values 不区分大小写。这将是相当不切实际的,因为没有办法真正检查真正的平等。因此,即使在 Oracle 中,'foo' = 'FOO' 的计算结果也是 false

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 2016-11-04
      • 1970-01-01
      • 2018-03-15
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多