【发布时间】:2015-02-09 00:57:03
【问题描述】:
我刚刚意识到当任何参数为空时,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 的这个奇怪方面?
【问题讨论】:
-
因为同样的原因,oracle 使用 null 而不是 =null。 docs.oracle.com/cd/B19306_01/server.102/b14200/…
-
同样的事情也适用于没有 ORM 框架的工作。让我们有一个 SQL 语句,例如 -
SELECT * FROM table_name WHERE column_name=:name。如果绑定命名参数的值为null,那么语句不会神奇地改变以自动反映IS NULL条件。不是吗? -
除了这是 JPQL 不是 SQL,因此实现完全有能力相应地决定其 SQL 并且应该能够应对。
-
您的解决方案仍然是一个很好的答案