在JPQL中处理null参数

时间:2014-12-10 17:52:34

标签: java hibernate jpa jpql

我刚刚意识到当任何参数为null时,JPQL where子句不能正常工作。 例如,这个简单的JPQL查询

SELECT en FROM Entity en WHERE en.name = :name
如果name参数为null,则

不返回任何结果,即使数据库中存在名称设置为null的实体。

在这种情况下,Hibernate使用WHERE entity.NAME = null执行SQL。显然,这不是由数据库处理的,因为标准为空比较定义了IS NULL(参见SQL is null and = null)。 JPQL也有IS NULL运算符(http://docs.oracle.com/javaee/6/tutorial/doc/bnbuf.html#bnbvi),其行为与SQL(http://docs.oracle.com/javaee/6/tutorial/doc/bnbuf.html#bnbvr)完全相同。

我认为这是一个常见的情况,但快速搜索没有给我任何有趣的结果。

那么,有没有办法在查询中包含空值? 到目前为止,我想出了以下内容:

SELECT en FROM Entity en WHERE (:name IS NULL AND en.name IS NULL) OR en.name = :name

它工作正常,但看起来并不优雅,尤其是在较大的查询中。

奖金问题:为什么JPQL模仿SQL这个奇怪的方面?

1 个答案:

答案 0 :(得分:3)

并非所有JPA实施都会将en.name = :name name参数转换为nullentity.NAME = null。例如,我使用的实现(DataNucleus JPA)将其转换为entity.NAME IS NULL IIRC。

JPQL没有告诉实现要执行什么SQL,只是用户可以定义的内容。其余的是由实施决定。用户可以决定使用哪种实现。

相关问题