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
我试过的所有方法。
例如:
field("static_name", Long[].class).isNull()
field("static_name", Long[].class).equal(new Long[] {null})
field("static_name", Long[].class).equal(DSL.castNull(Long[].class)
field("static_name", Long[].class).cast(String.class).eq(DSL.value("{null}")))
field("static_name", Long[].class).cast(String.class).eq(DSL.value("'{null}'")))
知道我做错了什么吗?
注意:我确实尝试使用普通 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());
我有一个项目使用 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
我试过的所有方法。
例如:
field("static_name", Long[].class).isNull()
field("static_name", Long[].class).equal(new Long[] {null})
field("static_name", Long[].class).equal(DSL.castNull(Long[].class)
field("static_name", Long[].class).cast(String.class).eq(DSL.value("{null}")))
field("static_name", Long[].class).cast(String.class).eq(DSL.value("'{null}'")))
知道我做错了什么吗?
注意:我确实尝试使用普通 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());