【问题标题】:UPDATE-FROM clause in jOOQ throws an expecption for CTE fieldjOOQ 中的 UPDATE-FROM 子句引发对 CTE 字段的期望
【发布时间】:2020-05-31 09:44:35
【问题描述】:

我正在尝试将以下 PostgreSQL 查询转换为 jOOQ:

UPDATE book
SET amount = bat.amount
FROM (
    VALUES (2, 136),(5, 75)
) AS bat(book_id, amount)
WHERE book.book_id = bat.book_id;

FROM 子句中的 VALUES 是从 Map<Long, Integer> bookIdsAmountMap 参数创建的,我正在尝试以这种方式执行此操作:

class BookUtilHelper {

    @SuppressWarnings("unchecked")
    static Table<Record2<Long, Integer>> batTmp(DSLContext dsl, Map<Long, Integer> bookIdAmountMapUpdated) {
        Row2<Long,Integer> array[] = new Row2[bookIdAmountMapUpdated.size()];
        int i = 0;
        for (Map.Entry<Long, Integer> pair : bookIdAmountMapUpdated.entrySet()) {
            array[i]=DSL.row(pair.getKey(), pair.getValue());
            i++;
        }
        Table<Record2<Long, Integer>> batTmp = DSL.values(array);
        batTmp.fields("book_id", "amount");         
        return batTmp;
    } 
}

然后,我尝试创建可以像this 示例中那样访问的字段

Field<Long> bookIdField = DSL.field(DSL.name("bat", "book_id"), Long.class);
Field<Integer> amountField = DSL.field(DSL.name("bat", "amount"), Integer.class);
Table<Record2<Long, Integer>> batTmp = BookUtilHelper.batTmp(dsl, bookIdAmountMapUpdated);
// ctx variable is of type DSLContext
ctx.update(BOOK).set(BOOK.AMOUNT, amountField).from(batTmp.as("bat")) 
 .where(BOOK.BOOK_ID.eq(bookIdField));

当我尝试更新图书时,出现以下异常:

bat.book_id 列不存在

任何有关如何解决此问题的建议将不胜感激。 :)

【问题讨论】:

标签: java postgresql sql-update jooq


【解决方案1】:

这没有任何作用:

batTmp.fields("book_id", "amount");

而这只会重命名表,而不是列:

batTmp.as("bat")

改为这样写:

batTmp.as("bat", "book_id", "amount")

【讨论】:

  • 您好 Lukas,感谢您的建议,但不幸的是,它并没有帮助我解决问题,并且引发了另一个异常。我已经在 EDIT1 部分更新了我的问题,并对代码进行了更改,所以请看一下。
  • @NikolaS:这是一个不同的,可能不相关的问题。这个是关于创建派生列列表(AS table_alias (column_alias, ...) 语法)。新的是关于数据类型的。你介意问一个新的吗?我认为如果他们遇到单独的问题,这对未来的访问者会更有用。那么,我很乐意回答新的问题。
  • @Lukas_Eder:感谢您指出 Lukas,很高兴这样做。 :) 这是link 到您提出的新创建的问题。
  • 读者注意:在 Lukas 的帮助下,可以在我上面评论中提到的链接中找到完整的答案。再次感谢卢卡斯。 :)
猜你喜欢
  • 2011-07-13
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多