有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JOOQ“IN”查询引发空指针异常

当我们试图获取具有空值的数据时

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子句

jooqhttps://github.com/jOOQ/jOOQ/issues/3867中存在一个“无法修复”问题

有一些替代方案:

  • 在输入前检查null(在我的情况下无法执行这是一个非常大的select语句)

所以,如果我想让这成为可能,还有其他的解决办法吗

注:同样,“eq”也可以很好地工作:

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

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


共 (1) 个答案

  1. # 1 楼答案

    您的示例代码无法编译:

    TABLE_NAME.COLUMN_NAME.in(null)
    

    jOOQ 3.14中有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实现了three valued logic,这意味着NULL值在IN谓词中没有效果,而在NOT IN谓词中它们有一个不直观的、几乎不需要的效果(整个谓词变成NULL