Spring Data JPA - NUMBER 列类型的空参数问题

Posted

技术标签:

【中文标题】Spring Data JPA - NUMBER 列类型的空参数问题【英文标题】:Spring Data JPA - problem with null parameter for NUMBER column type 【发布时间】:2020-11-06 08:37:39 【问题描述】:

我想进行动态查询,如果发送特定参数,本机查询应根据它过滤结果。如果为 null,则不应反映结果。

我正在使用带有原生查询机制 + Oracle DB 的 Spring Data JPA

对于字符串参数,这种方法可以正常工作

:email is null or s.email = :email

但是对于具有值的整数参数,查询可以工作,但如果参数为空,则查询失败并出现错误

原因:java.sql.SQLSyntaxErrorException:ORA-00932:不一致的数据类型:预期的 NUMBER 得到了 BINARY

我对 Integer 使用完全相同的方法而不是 String

我想知道问题是在我这边还是某种错误?

【问题讨论】:

这能回答你的问题吗? java.sql.SQLException: ORA-00932: inconsistent datatypes: expected NUMBER got BINARY 感谢您的回复。不,这是产生相同错误的不同类型的问题。就我而言,我希望参数为“空”值。这个主题与我的问题有些相关,但建议的解决方案仅适用于 String 参数,不适用于 Integer - ***.com/questions/43780226/… 【参考方案1】:

在 Oracle DB 中,它不是这样工作的。一种解决方法是使用类似 JPQL 的

SELECT s FROM Entity s WHERE :id is null OR s.id = COALESCE(:id, -1)

或者原生查询使用oracle的TO_NUMBER函数

SELECT s FROM Entity s WHERE :id is null OR s.id = TO_NUMBER(:id)

【讨论】:

非常感谢@Eklavya。您的解决方案按预期工作。你能解释一下为什么当参数有值时,例如 Integer age = 1;查询有效,但当值为空时,例如 Integer age = null;失败了? @Tsvetoslav 在这里您可以找到dba.stackexchange.com/questions/4291/…的详细信息

以上是关于Spring Data JPA - NUMBER 列类型的空参数问题的主要内容,如果未能解决你的问题,请参考以下文章

spring-data-jpa 和 spring-boot-starter-data-jpa 的区别

spring-data详解之spring-data-jpa:简单三步快速上手spring-data-jpa开发

spring data jpa怎么和solr整合

spring data jpa问题

Spring Data 系列 Spring+JPA(spring-data-commons)

spring-data-jpa软删除方案