输入参数集合包含 null 的 JPQL 查询
JPQL query with input parameter collection containing null
我需要在以下 JPQL 查询中通过 IN 表达式比较可空实体 属性:
@NamedQuery(name = "query",
query = "SELECT e FROM MyEntity e WHERE e.status IN :statuses")
现在,我喜欢显示的 集合值输入参数 statuses
可选择包含 null
作为元素:
final List<MyEntity> actual = entityManager.createNamedQuery("query", MyEntity.class)
.setParameter("statuses", Arrays.asList(null, 1L))
.getResultList();
然而,对于 Hibernate/Derby,实际结果列表仅包含状态为 1L
的实体,而不包含 null
。
我没有在 JPA 2.2 规范中找到任何关于这种情况的信息。我是不是漏掉了什么,或者这是特定于供应商的?
的答案只解决了我的部分问题。在他们提出的解决方案中,null
比较被硬嵌入到查询中,无法通过集合值参数进行控制。
作为一名 Java 程序员,在 null = null
产生 true 的情况下,在 SQL(和 JPQL)中 null = null
本身就是 null
这是“虚假的”。结果,null in (null)
也产生 null。
相反,您需要使用 IS NULL
检查单独对待 null
:e.status IS NULL OR e.status IN :statuses
.
这在 JPA 规范的 4.11 空值中有描述:
- Comparison or arithmetic operations with a NULL value always yield an unknown value.
- Two NULL values are not considered to be equal, the comparison yields an unknown value.
我需要在以下 JPQL 查询中通过 IN 表达式比较可空实体 属性:
@NamedQuery(name = "query",
query = "SELECT e FROM MyEntity e WHERE e.status IN :statuses")
现在,我喜欢显示的 集合值输入参数 statuses
可选择包含 null
作为元素:
final List<MyEntity> actual = entityManager.createNamedQuery("query", MyEntity.class)
.setParameter("statuses", Arrays.asList(null, 1L))
.getResultList();
然而,对于 Hibernate/Derby,实际结果列表仅包含状态为 1L
的实体,而不包含 null
。
我没有在 JPA 2.2 规范中找到任何关于这种情况的信息。我是不是漏掉了什么,或者这是特定于供应商的?
null
比较被硬嵌入到查询中,无法通过集合值参数进行控制。
作为一名 Java 程序员,在 null = null
产生 true 的情况下,在 SQL(和 JPQL)中 null = null
本身就是 null
这是“虚假的”。结果,null in (null)
也产生 null。
相反,您需要使用 IS NULL
检查单独对待 null
:e.status IS NULL OR e.status IN :statuses
.
这在 JPA 规范的 4.11 空值中有描述:
- Comparison or arithmetic operations with a NULL value always yield an unknown value.
- Two NULL values are not considered to be equal, the comparison yields an unknown value.