首页 > 解决方案 > Hibernate NOT IN 空列表评估为 false

问题描述

我有以下休眠查询:

public long countHouseBoats(HouseBoat houseBoat, Type type, List<Long> excludedIds) {
   TypedQuery<Long> query = entityManager.createQuery("SELECT COUNT(o) FROM AquaticCity o " +
       "WHERE o.houseBoat = :houseBoat " +
       "AND o.chimneyType = :chimneyType " +
       "AND o.keel.manufacturer.id NOT IN (:excludedIds) " +
       "AND o.type.name IN (:types)", Long.class);
   query.setParameter("houseBoat", houseBoat);
   query.setParameter("chimneyType", ChimneyType.REGULAR);
   query.setParameter("excludedIds", excludedIds);
   query.setParameter("types", toStringList(List.of(type)));
   return query.getSingleResult();
}

如果excludedIds不为空,它会按我的预期工作。如果它是空的,那么就好像NOT IN <emptyList>评估为,而不是像人们期望的那样false总是评估为。true

我不知道为什么会发生这种情况。我已经阅读并存在一些类似的问题,但它们并不完全相同。

我将求助于检查列表是否为空的明显丑陋的解决方法,如果是,则在不检查的情况下构建查询excludedIds

标签: hibernate

解决方案


正如休眠文档中所解释的那样:

值列表可以来自许多不同的来源。在constructor_expressionand中collection_valued_input_parameter值列表不能为空;它必须至少包含一个值。

但实际上与谓词处理相关的行为在HHH-8901下发生了变化。在此处查看更多详细信息。也许这就是为什么你得到你所得到的。


推荐阅读