Hibernate NOT IN空列表计算结果为false



我有以下hibernate查询:

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_expressioncollection_valued_input_parameter中,的值列表不能为空;必须至少包含一个值

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

最新更新