Jooq ArrayAgg#isNull 没有按预期工作

Jooq ArrayAgg#isNull not working as expected

我有一个项目使用 jooq + postgres 和多个表以及它们之间的关系。

当我使用 jooq 创建一个 select 查询时,我不得不为我的特定场景使用 arrayAgg

dslContext.select(arrayAgg(tableName.INTEGER_LETS_SAY).as("static_name")

特定列 INTEGER_LETS_SAY 可以为空。 当 arrayAgg 中传递的结果都是 null 那么 postgres 的响应是'{null}'(用 getQuery().getSql() 测试)但是 where 语句不能 return true 我试过的所有方法。

例如:

知道我做错了什么吗?

注意:我确实尝试使用普通 sql 进行查询,并且 static_name = '{null}' 有效

{NULL} 是 PostgreSQL 对包含一个 SQL NULL 值的数组的文本表示。您可以这样尝试:

select (array[null]::int[])::text ilike '{null}' as a

它产生:

a   |
----|
true|

请注意,我使用 ilike 进行不区分大小写的比较。在我的安装中,我得到的是 {NULL},而不是 {null}。如果你想将事物作为文本进行比较,你可以使用 Field.likeIgnoreCase() 来完成。例如。这对我有用:

System.out.println(ctx.select(
    field(val(new Long[] { null }).cast(String.class).likeIgnoreCase("{null}")).as("a")
).fetch());

制作中:

+----+
|a   |
+----+
|true|
+----+

但更好的是,不要使用文本表示。相反,follow this suggestion here。在 SQL:

select true = all(select a is null from unnest(array[null]::int[]) t (a)) as a

在 jOOQ 中:

System.out.println(ctx.select(
    field(inline(true).eq(all(
        select(field(field(name("a")).isNull()))
        .from(unnest(val(new Long[] { null })).as("t", "a"))
    ))).as("a")
).fetch());

由于 Field<Boolean> 中的所有包装 Condition 使用 DSL.field(Condition).

,它变得有点冗长

或者,使用例如NUM_NONNULLS()(此方法归功于 Vik Fearing):

System.out.println(ctx.select(
    field("num_nonnulls(variadic {0})", INTEGER, val(new Long { null }))
).fetch());