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开发