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

Posted

技术标签:

【中文标题】JOOQ“IN”查询抛出空指针异常【英文标题】:JOOQ "IN" Query throws null pointer exception 【发布时间】:2021-03-01 15:38:33 【问题描述】:

当我们尝试获取 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(在我的情况下,它是一个非常大的 select 语句)

如果我想让这成为可能,还有其他解决方法吗?

PS:在类似的注释中,“eq”工作得非常好:

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

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

【问题讨论】:

【参考方案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(),但这似乎不是您想要的。您可能希望在该集合inside 中传递实际的null 值,您可以这样做:

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

但是你为什么要这样做呢? SQL 实现了three valued logic,这意味着NULL 值在IN 谓词中无效,而它们在NOT IN 谓词中具有不直观、几乎不想要的效果(整个谓词变为NULL

【讨论】:

@Lucas 在我们的查询中,在查询中我们可能会得到 Null 的条件。是的,我们正在检查集合,该集合可以为空,所以我们最终使用这个 =========== isNull(collection) ? field(DSL.sql("null")).as(Column_Dummy_Name) : field(TABLE_NAME.COLUMN_NAME.in(collection)).as(Column_Dummy_Name) ========= 如果你还有其他的请告诉我想法。 @GuaravRatnawat:但是请看,如果 jOOQ 允许将 null 集合传递给 in(),那么它的行为与空集合相同,这与替换它不同通过field("null"),它将与inline(false) 相同,所以不是你想要的。明确说明您的意图是个好主意。

以上是关于JOOQ“IN”查询抛出空指针异常的主要内容,如果未能解决你的问题,请参考以下文章

为啥非空列表会抛出空指针异常?

Android Canvas drawcolor 抛出空指针异常

HashCode 抛出空指针异常

Play 2.4 Finder 抛出空指针异常

SAX XML 解析器抛出空指针异常

JSONObject 创建抛出空指针异常