sql - 使用 JPA、spring 和 kotlin Map 保存的 json 数据的正确值
问题描述
我在 postgres 数据库中有一个 jsonb 列,我将一堆键/值(1 级)存储到映射到 aa Map<String, Any) 的列中。
这些值应该是一个字符串,但在代码中我接受任何东西。所有保存的值都作为 ByteArray(byte[]) 传递,并且存储没有问题。
存储的值被转换为一个字符串,它与预期的不同。例如,当我将 mapOf("verion" 存储到 "1.0".toByteArray()) 我得到这个 => '{"version":"MS4w"}'
我可以修复代码以在持久化之前将 byte[] 转换为 String。
实体的映射如下:
@Entity
@Table(name = "MY_TABLE")
data class MyTableEntity(
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "my_id") val idDemandePrestation: Long?,
@Type(type = "jsonObject") @Column(name = "my_data", columnDefinition = "jsonb", nullable = false) val headers: Map<String, Any>
)
桌子:
CREATE TABLE IF NOT EXISTS MY_TABLE (
my_id BIGSERIAL PRIMARY KEY,
my_data JSONB NOT NULL
);
我的问题:有没有办法更正动态存储的数据的所有值,exp:使用查询或过程更新“MS4w”=>“1.0”和其他值?
提前致谢。
解决方案
运行此函数应修复编码为 base64 的数据值:
CREATE OR REPLACE function update_my_table()
RETURNS INTEGER
LANGUAGE plpgsql AS -- language declaration required
$func$
DECLARE
i record;
_key text;
_value text;
update_query text;
tmp text;
BEGIN
For i in select * from my_table
LOOP
FOR _key, _value IN
SELECT * FROM jsonb_each_text(i.my_data)
LOOP
tmp := convert_from(decode(_value, 'base64'), 'UTF-8');
update_query := ' update my_table set my_data = jsonb_set(my_data, ''{"' ||
_key || '"}'', ''"' || tmp ||
'"'') where my_id=' || i.my_id;
raise notice '%', update_query;
execute update_query;
END LOOP;
END LOOP;
return 0;
END
$func$;
推荐阅读
- sql - plsql查询抛出带引号的字符串未终止错误
- mysql - 如何在 MySQL 查询中选择查询某个值?
- react-native - 如何使 BottomTabBar 上的图标扩展 BottomTabBar
- html - Blazor 应用程序中的 EditForm 有多个提交按钮
- reactjs - Axios NTLM 不适用于 POST(但适用于 GET)
- python - Celery/Django 工作人员检测何时没有工作
- java - 局部变量背后的想法是最终的,但在使用内部类时外部类字段不是
- javascript - 如何让 span 元素完全覆盖按钮?
- javascript - 如何通过登录 React Admin 来实现额外的自定义对话框(基于服务器响应)?
- postgresql - Postgresql对中等大表的简单查询非常慢