我刚刚意识到当任何参数为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这个奇怪的方面?
答案 0 :(得分:3)
并非所有JPA实施都会将en.name = :name
name
参数转换为null
到entity.NAME = null
。例如,我使用的实现(DataNucleus JPA)将其转换为entity.NAME IS NULL
IIRC。
JPQL没有告诉实现要执行什么SQL,只是用户可以定义的内容。其余的是由实施决定。用户可以决定使用哪种实现。