Tom*_*z W 6 java hibernate jpa jpql
我刚刚意识到当任何参数为null时,JPQL where子句不能像我预期的那样工作.例如,这个简单的JPQL查询
SELECT en FROM Entity en WHERE en.name = :name
Run Code Online (Sandbox Code Playgroud)
当name参数为null时,即使数据库中存在名称设置为null的实体,也不会返回任何结果.
在那种情况下,Hibernate用SQL执行WHERE entity.NAME = null.显然,这不是由数据库处理的,因为标准定义IS NULL了空比较(参见SQL为null和= 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
Run Code Online (Sandbox Code Playgroud)
它工作正常,但看起来不优雅,尤其是在较大的查询中.
奖金问题:为什么JPQL模仿SQL这个奇怪的方面?
并非所有 JPA 实现都会en.name = :name使用name参数 asnull进行转换entity.NAME = null。例如,我使用的实现 (DataNucleus JPA) 将其转换为entity.NAME IS NULLIIRC。
JPQL 不会告诉实现执行什么 SQL,而只是告诉用户可以定义什么。其余的由实施决定。由用户决定使用哪种实现。