NamedParameterJdbcTemplate.batchUpdate() 采用 Map<String,Object> 数组,如何实例化参数数组以免收到警告?



NamedParameterJdbcTemplate.batchUpdate(( 对参数列表进行Map<String,Object>[]。 我不知道如何以不会被"通用实例化"错误或"未选中的分配"警告标记的方式实例化数组。 我真的希望Spring接受地图列表而不是数组。

是的,我读过:如何在 Java 中实例化映射数组?

但是,我不控制 spring-batch NamedParameterJdbcTemplate 接口,所以我无法更改 batchUpdate(( 方法的签名。

我有一个名为参数的List<Map<String,Object>>

我尝试了以下方法:

namedParameterJdbcTemplate.batchUpdate(
sql,
params.toArray(new Map<String,Object[0]) //generic instantiation error
); 
namedParameterJdbcTemplate.batchUpdate(
sql,
params.toArray(new Map[0]) //unchecked assignment warning
); 

完整代码:

class MyItemWriter implements ItemWriter<MyRecord> {
@Autowired
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
public void write(List<? extends MyRecord> items) {
String sql = MyRecord.UPDATE_SQL;
List<Map<String,Object>> params 
= items.stream()
.map(record->new MapBuilder<String,Object>()
.put("param1",record.getField1())
.put("param2",record.getField2())
.build())
.collect(Collectors.toList());
namedParameterJdbcTemplate.batchUpdate(
sql,
params.toArray(new Map<String,Object>[0]) //generic instantiation error
);
namedParameterJdbcTemplate.batchUpdate(
sql,
params.toArray(new Map[0]) //unchecked assignment warning.
);
}
}

在 java 中,您无法创建Map<String, Object>数组。

参考: https://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#createArrays

因此,您创建一个Map[]然后将其转换为带有"未选中的投射"警告的Map<String, Object>[]。这样的警告是可以抑制的。JDK 示例:https://github.com/AdoptOpenJDK/openjdk-jdk14/blob/master/src/java.base/share/classes/java/util/Map.java#L1682:L1689

namedParameterJdbcTemplate.batchUpdate(sql, toArray(params));

@SuppressWarnings("unchecked")
private static Map<String, ?>[] toArray(List<Map<String, ?>> params) {
return params.toArray(new Map[0]);
}

注意:在您的"完整代码"示例中,无需收集到中间列表。您可以直接将流分配给数组。不幸的是,StreamtoArray()的无参数版本仍然不是通用的。因此,您必须再次使用带有不可避免的但可抑制警告的重载toArray(n->new Map[n])版本:

Map<String,?>[] params = items.stream()
.map(record -> Map.of(
"param1",record.getField1(),
"param2",record.getField2()))
.toArray(this::newArray);

@SuppressWarnings("unchecked")
private Map<String,?>[] newArray(int n) {
return new Map[n];
}

最新更新