java - 是否有 jpa 或 hibernate 属性使所有查询不区分大小写

标签 java oracle hibernate jpa spring-data-jpa

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

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

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

or 

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

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

最佳答案

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

你的问题有点误导。 查询语言(JPQL)本身确实不区分大小写。不仅查询关键字不区分大小写,甚至对于 Java 区分大小写的标识符也不区分大小写。例如,您可以在同一个 Java 类中包含 myVarmyvarMYVAR,它们都是不同的实例变量。如果此类被转换为 @Entity 并且您使用该实体编写查询,那么对于 JPA 来说,您指的是哪个变量将是不明确的。 (虽然没有测试过,所以不确定会产生什么样的错误。)

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

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

但这并不意味着数据库列中的字符串被视为不区分大小写。这是相当不切实际的,因为无法实际检查是否真正平等。因此,即使在 Oracle 中,'foo' = 'FOO' 的计算结果也为 false

关于java - 是否有 jpa 或 hibernate 属性使所有查询不区分大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61902766/

相关文章:

java - 如何将自定义版本的 WebDataBinder 注入(inject) Spring 3 MVC?

java - 简单的java程序根据它们的值来处理canopy簇字符串

c++ - 将 oracle oci.dll 与 mingw w64 64 位编译器一起使用

sql - 多行sql查询出错

java - 如何为 Hibernate 域对象编写单元测试

java - 创建的链接列表未返回正确的索引

java - Tomcat 无法加载我的 jsp 文件 - 服务器未找到当前表示

sql - Oracle 更新列 LTRIM 和 RTRIM

java - 使用命名查询时 ManyToMany NOT NULL 检查约束

hibernate - 从Hibernate 4迁移到5