输入参数集合包含 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 检查单独对待 nulle.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.