,sql,postgresql,kotlin,jpa,jsonb"/>

首页 > 解决方案 > 使用 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 编码的 在此处输入图像描述

提前致谢。

标签: sqlpostgresqlkotlinjpajsonb

解决方案


运行此函数应修复编码为 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$;

推荐阅读