簡體   English   中英

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 代碼時,我得到以下異常:

運算符不存在:bigint = text

非常感謝有關解決此問題的任何幫助/建議。 :)

此問題似乎與 PostgreSQL 無法從 jOOQ VALUES表達式中猜測正確數據類型的已知問題有關。 我需要對此進行進一步調查,並將更新我的答案。

一種解決方法是將綁定值顯式轉換為適當的數據類型:

array[i] = DSL.row(
  DSL.val(pair.getKey()).cast(SQLDataType.BIGINT), 
  DSL.val(pair.getValue()).cast(SQLDataType.INTEGER)
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM