带有 jooq 的 postgres 数组范围符号

postgres array range notation with jooq

在我的 postgres 数据库中,我有一个 jsons (json[]) 数组来跟踪 json 对象形式的错误。如果有更新,我想将最新的错误附加到该数组,但只保留最新的 5 个错误(所有 sql 已简化):

update dc
set 
    error_history           =
        array_append(dc.error_history[array_length(dc.error_history, 1) - 4:array_length(dc.error_history, 1)+1], cast('{"blah": 6}' as json))
where dc.id = 'f57520db-5b03-4586-8e77-284ed2dca6b1'
;

这在原生 sql 中工作正常,我尝试在 jooq 中复制它如下:

.set(dc.ERROR_HISTORY,
    field("array_append(dc.error_history[array_length(dc.error_history, 1) - 4:array_length(dc.error_history, 1) + 1], cast('{0}' as json))", dc.ERROR_HISTORY.getType(), latestError)
);

但似乎 : 使库认为那里有一个绑定参数。生成的 sql 是:

array_append(dc.error_history[array_length(dc.error_history, 1) - 4?(dc.error_history, 1) + 1], cast('{0}' as json)

我得到的错误是

nested exception is org.postgresql.util.PSQLException: ERROR: syntax error at or near ""

我完全同意:D

有什么方法可以转义 java 代码中的 : 或者有更好的方法吗?

编辑: 我也尝试过使用 arrayRemove 函数在更新时删除第一个元素,但这也没有用,因为它不是按索引工作,而是按元素工作,而 postgres 不知道如何检查 json 元素相等。

天哪,答案真的很简单:D

field("array_append(dc.error_history[array_length(dc.error_history, 1) - 4 : array_length(dc.error_history, 1) + 1], cast({0} as json))", dc.ERROR_HISTORY.getType(), latestError)

只需在冒号周围添加空格即可正常工作。请注意,我在 {0} 周围加上单引号又犯了一个错误,因为 latestError 对象已经是 JSON.

类型