1

我正在尝试使用 jOOQ 查找给定列表中不存在的值的列表。

例如,我的列表中有值1, 2, 3, 4

数据库已经有1和的条目2

我正在寻找一个 jOOQ 查询,它将返回结果34

我知道这可以通过 sql 中的VALUESandEXCEPT术语来完成,并且我知道这些存在于 jOOQ 中,并且一直在尝试复制这些,但是这里解释的使用值的简单案例使用静态列表(而我的将提供以编程方式),我不确定是否是原因,或者它是否是更通用的语法。我还没有except在 jOOQ online 中找到一个很好的例子。

我试过的:

List<String> valuesList
create.select()
    .from(values(getRowsFromList(valuesList)))
    .except(select(TABLE.VALUE).from(TABLE))
    .fetch(TABLE.VALUE)

values 需要一个 varargRowN对象,所以我正在转换这些值

private RowN[] getRowsFromList(List<String> rows)
{
    return rows.stream().map(DSL::row).toArray(RowN[]::new);
}

错误:

java.lang.IllegalArgumentException: Field ("public"."table"."value") is not contained in Row ("v"."c1")

使用 java 11、postgres 11 后端、jooq 3.13.12

4

1 回答 1

1

您的查询没有table.value列。它甚至没有value专栏。当您使用集合操作时,投影列名称是集合操作的第一个子查询的列名,例如:

SELECT a
FROM (VALUES (1), (2), (3), (4)) AS t (a)
EXCEPT
SELECT value
FROM table

这将生成一个带有列的表a。但是您没有命名第一EXCEPT个子查询的列,因此名称未定义(jOOQ 和/或 PostgreSQL 可能会产生一个,但我不会依赖它)。

解决方案是使用派生列列表(AS t (a)我在上面使用的语法)来命名您的列。这应该可以解决您的查询:

create.select()
    .from(values(getRowsFromList(valuesList)).as("t", TABLE.VALUE.getName())
    .except(select(TABLE.VALUE).from(TABLE))
    .fetch(TABLE.VALUE)
于 2020-11-04T14:58:35.833 回答