gpt4 book ai didi

spring - Hextoraw() 在使用 NamedParameterJdbcTemplate 时不使用 IN 子句

转载 作者:行者123 更新时间:2023-12-04 17:57:24 36 4
gpt4 key购买 nike

我正在尝试使用 RAW(255) 的 id 更新我的 oracle 数据库中的某些行。样本 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);
}

上面的代码块执行时没有任何错误,但更新没有反射(reflect)到数据库中,而如果我跳过使用 hextoraw() 并只传递 ids 列表,它工作正常并且还更新数据表。看下面代码

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() 将使用索引来扫描表格,但它不会更新有点奇怪的值。

最佳答案

通过尝试所有不同的组合,我自己找到了解决方案:

@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);
}

这样做是创建一个查询,将 hextoraw 的所有 id 作为 id0、id1、id2 ...... 并将这些值添加到 MapSqlParameterSource 实例中,然后它工作正常,它还使用索引进行更新我的 table 。

  1. 运行我的新函数后,查询看起来像:更新订阅设置状态 = :status, modified_date = systimestamp其中 id 在 (hextoraw(:id0), hextoraw(:id1), hextoraw(:id2)...)
  2. MapSqlParameterSource 实例看起来像:{("id0", "randomUUID"),("id1", "randomUUID"), ("id2", "randomUUID").....

关于spring - Hextoraw() 在使用 NamedParameterJdbcTemplate 时不使用 IN 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39258836/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com