JOOQ“ IN”查询抛出空指针异常

高拉夫·拉特纳瓦特

当我们尝试使用Null值获取数据时

field(TABLE_NAME.COLUMN_NAME.in(null))

与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);
    }

在数据库中,我们可以在IN子句中提供null。

jooq中存在一个现有的“无法解决”问题https://github.com/jOOQ/jOOQ/issues/3867

有一些替代方法:

  • 在IN之前检查null(在我看来,这是一个很大的选择语句)

因此,如果我想做到这一点,还有其他解决方法。

PS:类似地,“ eq”可以很好地工作:

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

编辑:'field(TABLE_NAME.COLUMN_NAME.in(null))'这里的null是一个集合。

卢卡斯·埃德(Lukas Eder)

您的示例代码无法编译:

TABLE_NAME.COLUMN_NAME.in(null)

in()在jOOQ 3.14中,方法有5个重载,因此,您不能将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谓词中不起作用,而值在谓词中具有不直观,几乎不希望的作用NOT IN(整个谓词变为NULL

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章