PostgreSQL原生查询:JSON值存储异常问题排查
PostgreSQL原生查询JSON存储格式错误修复方案
问题根源
你当前存储的JSON带外层引号和转义字符,核心原因是to_json()函数把传入的JSON字符串当作普通文本处理,将其包装成了JSON的字符串类型。比如传入"{\"user_id\":\"12345\"}",to_json()会把它转成JSON值"{\"user_id\":\"12345\"}"(即存储为带引号的字符串),而非解析成JSON对象。
修复方案
根据userData.userData的实际类型,选择对应方案:
方案1:如果userData.userData是预先序列化好的JSON字符串
直接将字符串转换为PostgreSQL的json或jsonb类型插入,无需使用to_json():
@Transactional @Modifying @Query(value = "INSERT INTO USER_DATA_TEST (USER_DATA) VALUES (cast(:#{#userData.userData} as json))", nativeQuery = true) public void saveUserData(@Param("userData") UserData userData);
如果你的字段类型是jsonb(推荐用于索引和复杂查询),把cast目标改成jsonb即可:
@Transactional @Modifying @Query(value = "INSERT INTO USER_DATA_TEST (USER_DATA) VALUES (cast(:#{#userData.userData} as jsonb))", nativeQuery = true) public void saveUserData(@Param("userData") UserData userData);
方案2:如果userData.userData是Java对象(未序列化)
直接使用to_jsonb()(或to_json())将Java对象转换为JSON对象存储,此时JPA会自动处理对象到JSON的序列化:
@Transactional @Modifying @Query(value = "INSERT INTO USER_DATA_TEST (USER_DATA) VALUES to_jsonb(:#{#userData.userData})", nativeQuery = true) public void saveUserData(@Param("userData") UserData userData);
验证
执行插入后,查询表数据:
SELECT USER_DATA FROM USER_DATA_TEST;
预期结果应为不带外层引号和转义的JSON对象:
{"user_id": "12345", "user_name": "test_name", "email": "test@test.com"}
内容的提问来源于stack exchange,提问作者Code Junkie
相关产品推荐
相关产品推荐

