使用NamedParameterJdbcTemplate时,Hextoraw()不使用IN子句

时间:2016-08-31 20:54:45

标签: spring oracle jdbc

我正在尝试使用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()将使用索引来扫描表,但它不会更新那种奇怪的值。

1 个答案:

答案 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实例中添加了这些值,然后这个工作正常,它还使用索引进行更新我的桌子。

  1. 运行我的新功能后,查询如下所示:更新 SUBSCRIPTIONS设置status =:status,modified_date = systimestamp 其中id为(hextoraw(:id0),hextoraw(:id1),hextoraw(:id2)...)
  2. MapSqlParameterSource实例如下所示: {(&#34; id0&#34;,&#34; randomUUID&#34;), (&#34; id1&#34;,&#34; randomUUID&#34;),(&#34; id2&#34;,&#34; randomUUID&#34;).....} < / LI>