jOOQ 中的 UPDATE-FROM 子句抛出比较数据类型的异常
UPDATE-FROM clause in jOOQ throws an exception for comparing data types
我在 jOOQ 中访问 UPDATE-FROM 子句中的值时遇到问题。我想转换以下 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 子句中的 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 代码时,出现以下异常:
operator does not exist: bigint = text
非常感谢任何 help/advice 解决此问题的方法。 :)
这个问题似乎与 known issue 有关,其中 PostgreSQL 无法从 jOOQ VALUES
表达式中猜测正确的数据类型。我需要进一步调查,并更新我的答案。
解决方法是将绑定值显式转换为适当的数据类型:
array[i] = DSL.row(
DSL.val(pair.getKey()).cast(SQLDataType.BIGINT),
DSL.val(pair.getValue()).cast(SQLDataType.INTEGER)
);
我在 jOOQ 中访问 UPDATE-FROM 子句中的值时遇到问题。我想转换以下 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 子句中的 VALUES 是从 Map bookIdsAmountMap 参数创建的,我正在尝试以这种方式执行:
到目前为止,这是我在
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 代码时,出现以下异常:
operator does not exist: bigint = text
非常感谢任何 help/advice 解决此问题的方法。 :)
这个问题似乎与 known issue 有关,其中 PostgreSQL 无法从 jOOQ VALUES
表达式中猜测正确的数据类型。我需要进一步调查,并更新我的答案。
解决方法是将绑定值显式转换为适当的数据类型:
array[i] = DSL.row(
DSL.val(pair.getKey()).cast(SQLDataType.BIGINT),
DSL.val(pair.getValue()).cast(SQLDataType.INTEGER)
);