Scala调用acolyte.jdbc.rowList52报重载错误如何新增更多字段?
报错根因
你使用的acolyte.jdbc.RowLists.rowList52是Acolyte JDBC提供的类型安全行列表构造方法,这类带数字后缀的rowListN方法最多只预设到了52列的实现,只支持接收恰好52个入参(要么是52个Class类型对象,要么是52个Column类型对象)。你尝试新增字段后参数数量超过52,编译器自然找不到匹配的重载方法,同时你代码中传入的classOf[X] -> "列名"是二元组类型,也和官方重载的入参类型不匹配。
可行解决方案
方案1:使用无列数限制的通用rowList方法(最推荐)
Acolyte提供了不带数字后缀的通用rowList构造方法,不限制列数,你只需要先把所有列定义转为Column对象,再作为变长参数传入即可,示例代码如下:
import acolyte.jdbc.{Column, RowLists} val ROWLIST = RowLists.rowList( Column(classOf[String], "ABC"), Column(classOf[String], "BCD"), Column(classOf[String], "PQR"), Column(classOf[String], "STU"), Column(classOf[String], "LMS"), // 后面可以随意新增任意数量的列定义,没有52列的上限 Column(classOf[Int], "NEW_COLUMN_1"), Column(classOf[String], "NEW_COLUMN_2") )
注意:这个方法返回的是通用RowList类型,不再带具体的列数泛型参数,后续从行中取值时如果需要类型安全,需要自行做类型校验转换。
方案2:合并字段避免突破列数限制
如果新增的字段属于关联度较高的扩展属性,你可以把多个字段序列化为JSON字符串,合并存到一个String类型的列中,使用时再反序列化解析,这样不需要修改原有行列表的结构,也能保留原有rowList52的类型安全特性。
方案3:自定义实现更高列数的类型安全行列表(不推荐)
如果必须保留类型安全且不愿意合并字段,可以参考Acolyte源码中RowList52的实现逻辑,自行编写RowList53、RowList54等更高列数的实现和对应的构造方法,这个方案开发成本较高,只有列数增量很少的场景下可以考虑。
内容的提问来源于stack exchange,提问作者apoorva kulkarni
相关产品推荐
相关产品推荐

