我正在尝试使用RA(255)的id更新我的oracle DB中的某些行。 样品ID 0BF3957A016E4EBCB68809E6C2EA8B80,1199B9F29F0A46F486C052669854C2F8 ......
@Autowired
private NamedParameterJdbcTemplate jdbcTempalte;
private static final String UPDATE_SUB_STATUS = "update SUBSCRIPTIONS set status = :status, modified_date = systimestamp where id in (:ids)";
public void saveSubscriptionsStatus(List<String> ids, String status) {
MapSqlParameterSource paramSource = new MapSqlParameterSource();
List<String> idsHexToRaw = new ArrayList<>();
String temp = new String();
for (String id : ids) {
temp = "hextoraw('" + id + "')";
idsHexToRaw.add(temp);
}
paramSource.addValue("ids", idsHexToRaw);
paramSource.addValue("status", status);
jdbcTempalte.update(*UPDATE_SUB_STATUS*, paramSource);
}
上面的代码块正在执行而没有任何错误但是更新没有反映到db,而如果我跳过使用hextoraw()并且只是传递id列表它工作正常并且还更新数据表即可。见下面的代码
public void saveSubscriptionsStatus(List<String> ids, String status) {
MapSqlParameterSource paramSource = new MapSqlParameterSource();]
paramSource.addValue("ids", ids);
paramSource.addValue("status", status);
jdbcTempalte.update(UPDATE_SUB_STATUS, paramSource);
}
此代码工作正常并更新表,但由于我不使用hextoraw(),因此我会扫描整个表以进行更新,因为我创建了索引。所以使用hextoraw()将使用索引来扫描表,但它不会更新那种奇怪的值。
答案 0 :(得分:0)
通过尝试所有不同的组合来获得解决方案:
@Autowired
private NamedParameterJdbcTemplate jdbcTempalte;
public void saveSubscriptionsStatus(List<String> ids, String status) {
String UPDATE_SUB_STATUS = "update SUBSCRIPTIONS set status = :status, modified_date = systimestamp where id in (";
MapSqlParameterSource paramSource = new MapSqlParameterSource();
String subQuery = "";
for (int i = 0; i < ids.size(); i++) {
String temp = "id" + i;
paramSource.addValue(temp, ids.get(i));
subQuery = subQuery + "hextoraw(:" + temp + "), ";
}
subQuery = subQuery.substring(0, subQuery.length() - 2);
UPDATE_SUB_STATUS = UPDATE_SUB_STATUS + subQuery + ")";
paramSource.addValue("status", status);
jdbcTempalte.update(UPDATE_SUB_STATUS, paramSource);
}
这样做是创建一个查询,其中包含所有id为hextoraw的id0,id1,id2 ......并且还在MapSqlParameterSource实例中添加了这些值,然后这个工作正常,它还使用索引进行更新我的桌子。