这是因为SQLnull的特殊性。在SQL中:

  • NULL 不等于任何值,甚至不等于 NULL 本身。

  • IN 操作符是基于等值比较的column IN (value1, value2, ...) 实际上是 column = value1 OR column = value2 OR ... 的简写。

  • 因此column IN (NULL, '') 会被解释为 column = NULL OR column = ''

  • 而 column = NULL 这个条件在 SQL 中永远是 FALSE,因为它不能用 = 来判断 NULL。要判断一个字段是否为 NULL,必须使用 IS NULL 操作符。

  • 应将写法改为:wrapperX.and(i -> i.isNull(Entity::getCol) .or().eq(Entity::getCol, ""));