0

我需要在以下 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比较被硬生化到查询中,无法通过集合值参数进行控制。

4

1 回答 1

1

作为一名 Java 程序员,如果null = null结果为真,那么在 SQL(和 JPQL)null = null中它本身null就是“假的”可能会让人感到惊讶。结果,null in (null)也产生 null 。

相反,您需要null单独处理IS NULL检查:e.status IS NULL OR e.status IN :statuses

这在 JPA 规范的 4.11 Null Values 中有描述:

  • 具有 NULL 值的比较或算术运算总是产生未知值。
  • 两个 NULL 值不被认为是相等的,比较会产生一个未知值。
于 2021-10-04T15:16:21.683 回答