java - 以什么顺序为带有 RETURN_GENERATED_KEYS 标记的 jdbcOperations.execute 语句返回生成的 ID?
问题描述
我没有在官方文档中找到任何提及在 jdbcOperations.execute 方法中返回的生成 ID 的顺序。虽然知道顺序对我来说非常重要。
我有一个方法,它接受一个没有 ID 的对象列表,应该在生成后填充。如果生成的 ID 以与对象列表中相同的顺序返回,那么我可以遍历两个列表并将 ID 分配给对象。否则我需要使用返回的 ID 执行另一个选择查询,这会影响我的性能。
这是这种方法的示例:
public static List<Long> executeBatchInsert(final ParsedSql parsedSql, final SqlParameterSource[] batchArgs, JdbcOperations jdbcOperations) {
if (batchArgs.length <= 0) {
return Lists.newArrayList();
}
String sqlToUse = NamedParameterUtils.substituteNamedParameters(parsedSql, batchArgs[0]);
BatchPreparedStatementSetter pss = new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
Object[] values = NamedParameterUtils.buildValueArray(parsedSql, batchArgs[i], null);
int[] columnTypes = NamedParameterUtils.buildSqlTypeArray(parsedSql, batchArgs[i]);
setStatementParameters(values, ps, columnTypes);
}
@Override
public int getBatchSize() {
return batchArgs.length;
}
};
return jdbcOperations.execute(
con -> con.prepareStatement(sqlToUse, Statement.RETURN_GENERATED_KEYS),
(PreparedStatementCallback<List<Long>>) ps -> {
int batchSize = pss.getBatchSize();
for (int i = 0; i < batchSize; i++) {
pss.setValues(ps, i);
ps.addBatch();
}
ps.executeBatch();
List<Long> result = new ArrayList<>();
// Here I need to be sure that keys order is the same as in SqlParameterSource[]
ResultSet keys = ps.getGeneratedKeys();
while (keys.next()) {
result.add(keys.getLong(1));
}
return result;
});
}
解决方案
推荐阅读
- cuda - 如何在 CUDA 中定义全局常量?
- asp.net-mvc - 关于 ASP.NET MVC 中路由的一些基本问题
- python - 尝试根据限制选择行时出现问题?
- python - 我正在使用 K-NNs 分类进行文本分析
- javascript - React Typescript:无法将组件分配给元素
- servicestack - 将 JwtAuthProviderReader 与 ServiceStack 和 AWS Cognito 一起使用
- python - 如何在嵌套列表中获取特定深度级别的所有元素?
- android - 简单的 Android 房间查询不返回任何内容
- php - WordPress 函数调用页面内容的特定部分
- typescript - TS2339:交替类型无法识别属性