首页 > 解决方案 > 查询从 Java 层在 DB 中的 Saved Json 中插入新的 json 字符串

问题描述

我们在 DB 中有一列以字符串格式保存 JSON 值,例如:

{"listOfPlaces" : [1,2,3], "segment" : 1}

现在,我们需要从带有 UPDATE Query 的 JAVA 层更新 JSON。例如:我们需要添加

 activityId : 1

这里保存在 DB 的 JSON 中。

这样我们就可以将 JSON 存储为:

{"listOfPlaces" : [1,2,3], "segment" : 1, activityId : 1}

我尝试使用下面提到的代码,但不确定它是否准确。

MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue(newFieldName, newFilterCriteriaForAddition.getName());
parameters.addValue(newFieldValue, newFilterCriteriaForAddition.getDefaultValue());
int update = namedParameterJdbcTemplate.update(Constant.SQL_TO_ADD_FILTER_CRITERIA_IN_SAVED_REPORT, parameters);

和查询是:

"UPDATE adv.sav_table SET filter_crtr = LEFT(rpt_filter_crtra, -1)  + "||CONCAT("
+ ",\""
+ ":newFieldName:"+":"+newFieldValue"+"}"+") "

标签: javapostgresql

解决方案


无需字符串操作:

如果该列被定义为jsonb(它应该是),您可以简单地连接新值:

update adv.sav_table 
   SET filter_crtr  = filter_crtr || '{"activityId":1}'
where ...;

这可以通过 PreparedStatement 来完成:

update adv.sav_table 
   SET filter_crtr  = filter_crtr || cast(? as jsonb)
where ...;

然后使用

PreparedStatement pstmt  = connection.prepareStatement("UPDATE ...");
psmt.setString(1, "{\"activityId\":1}");

推荐阅读