JOOQ "IN" 查询抛出空指针异常
JOOQ "IN" Query throws null pointer exception
当我们尝试获取具有 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 是一个集合。
您的示例代码无法编译:
TABLE_NAME.COLUMN_NAME.in(null)
在 jOOQ 3.14 中这个 in()
方法有 5 个重载,因此,你不能将 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
)
当我们尝试获取具有 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 是一个集合。
您的示例代码无法编译:
TABLE_NAME.COLUMN_NAME.in(null)
在 jOOQ 3.14 中这个 in()
方法有 5 个重载,因此,你不能将 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
)