带有 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
.
类型
在我的 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
.