jOOQ中的UPDATE-FROM子句会因为比较数据类型而抛出异常。

问题描述 投票:0回答:1

当我在jOOQ中访问UPDATE-ROM子句中的值时,遇到了一个问题。我想转换以下PostgreSQL查询。

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-clause中的VALUES是从Map bookIdsAmountMap参数中创建的,我试图以这种方式执行:这是我目前在我的代码中所做的(根据Lukas Eder的建议)。这个 问题。

Row2<Long,Integer> array[] = new Row2[bookIdAmountMap.size()];
int i = 0;
for (Map.Entry<Long, Integer> pair : bookIdAmountMap.entrySet()) {
    array[i] = DSL.row(pair.getKey(), pair.getValue());
    i++;
}
Table<Record2<Long, Integer>> bat = DSL.values(array);
bat = bat.as("bat", "book_id", "amount");
Field<Long> bookIdField = DSL.field(DSL.name("bat", "book_id"), Long.class);
Field<Integer> amountField = DSL.field(DSL.name("bat", "amount"), Integer.class);

ctx.update(BOOK).set(BOOK.AMOUNT, amountField).from(bat) // same result as if I am using in .from(bat.as("bat", "book_id", "amount"))  
                .where(BOOK.BOOK_ID.eq(bookIdField)); 

当我执行Java代码时,我得到以下异常。

操作符不存在:bigint = text

如果有任何关于解决这个问题的帮助建议,我们将非常感激。 :)

java postgresql sql-update jooq
1个回答
1
投票

这个问题似乎与一个 已知问题 其中PostgreSQL无法从jOOQ中猜出正确的数据类型。VALUES 的表达方式。我需要进一步调查这个问题,并会更新我的答案。

一个变通的方法是将你的绑定值显式地投向适当的数据类型。

array[i] = DSL.row(
  DSL.val(pair.getKey()).cast(SQLDataType.BIGINT), 
  DSL.val(pair.getValue()).cast(SQLDataType.INTEGER)
);
© www.soinside.com 2019 - 2024. All rights reserved.