jooq“in”查询抛出空指针异常

kmynzznz  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(334)

当我们试图用空值获取数据时 field(TABLE_NAME.COLUMN_NAME.in(null)) with in子句获取空指针异常。
也许是因为这个。

@Override
    public final Condition in(Collection<?> values) {
        Field<?>[] fields = new Field[values.size()];

        Iterator<?> it = values.iterator();
        for (int i = 0; it.hasNext(); i++)
            fields[i] = Tools.field(it.next(), this);

        return in(fields);
    }

在数据库中,我们可以提供null in子句。
jooq中存在一个“无法修复”的问题https://github.com/jooq/jooq/issues/3867
有一些替代方案:
在输入前检查null(在我的情况下不能做这是一个非常大的select语句)
所以如果我想让这成为可能,有没有其他的解决办法。
附言:同样的,“情商”也很好:

@Override
    public final Condition equal(Field<T> field) {
        return compare(EQUALS, nullSafe(field, getDataType()));
    }

edit:'field(table\u name.column\u name.in(null))'这里null是一个集合。

eqzww0vc

eqzww0vc1#

示例代码无法编译:

TABLE_NAME.COLUMN_NAME.in(null)

这个有5个重载 in() 方法,因此,您不能传递 null 直译 in() 方法。您真正的客户机代码可能使用如下局部变量:

Collection<?> collection = null;
TABLE_NAME.COLUMN_NAME.in(collection)

可能存在这样一种情况,即它的行为应该与传递空集合的行为相同,例如 Collections.emptyList() 但这不是你想要的。你可能想通过考试 null 集合中的值,您可以执行以下操作:

TABLE_NAME.COLUMN_NAME.in(1, null, 2)

但你为什么要这么做?sql实现了三值逻辑,这意味着 NULL 值在中不起作用 IN predicate ,虽然它们在 NOT IN predicate (整个 predicate 变成 NULL )

相关问题