java.lang.ClassCastException:
class [Ljava.lang.Object; cannot be cast to class
[Lru.yota.finservices.rs.db.model.MonthAvgServiceData;
([Ljava.lang.Object; is in module java.base of loader 'bootstrap';
[Lru.yota.finservices.rs.db.model.MonthAvgServiceData; is in unnamed module of loader 'app')
错误文本。
存储过程调用方法。
SimpleJdbcCall call = new SimpleJdbcCall(template)
.withCatalogName(CATALOG_NAME)
.withFunctionName("getMonthAVGServiceRegistryData")
.declareParameters(monthAvgServiceData());
SqlParameterSource source = new MapSqlParameterSource()
.addValue("p_date", date, Types.DATE)
.addValue("p_Service_id", serviceId, Types.BIGINT);
List<MonthAvgServiceData> monthAvgServiceData = Arrays.asList(call.executeFunction(MonthAvgServiceData[].class, source)); // тут ошибка.
方法 .declareParameters(monthAvgServiceData());
private SqlOutParameter monthAvgServiceData() {
return new SqlOutParameter("return",
OracleTypes.ARRAY,
"T_MONTH_AVG_SERVICE_DATA_LIST",
new SqlReturnStructArray<>(RecursiveBeanPropertyStructArrayMapper.newInstance(MonthAvgServiceData.class))
);
}
从存储过程本身,数据作为对象返回。截屏。
但是当您尝试转换为数组时,它会因错误而崩溃。

在这里,来自 Java 的隐式语法糖很可能让你失望了。如果您查看 SimpleJdbcCall#executeFunction 的实现,您可以看到以下内容:
那些。第一个参数本身不使用,但需要作为语法糖。也许你的编译器替换
在
这就是引发错误的原因。
为什么
Object[]返回而不返回MonthAvgServiceData[]。如果您查看SqlReturnStructArray 的实现,您可以看到这种构造并且List#toArray()方法返回一个无类型数组,这与下面的其他位置不同。
从视觉上看,这个问题可以通过这样的坠落测试来表现:
测试结果:
尝试以下形式的小技巧: