我正在尝试使用Squeryl为数据库编写一个快速数据浏览器,但我很难以通用方式迭代所有表。基于Squeryl SchoolDb example我尝试了以下内容:
def browseTable(name: String) = {
SchoolDb.tables.find(_.name == name) map { t=>
val fields = t.posoMetaData.fieldsMetaData
val rows = from (t) (s => select(s))
// Print the columns
println(fields.map(_.columnName).mkString("\t"))
rows map { row =>
println(fields.map(f => f.get(row)).mkstring("\t"))
}
}
编译器对这种尝试不太满意(缺少'row'的类型类型),我可以理解它的困境。明确地将参数声明为Any只是将编译错误更改为“在'f.get(row)'
上没有Any => org.squeryl.dsl.ast.TypedExpressionNode [_]”的隐式视图如何修复此问题或更改模型(可能添加某种特征)以启用对所有表中所有数据的通用访问?
答案 0 :(得分:1)
编译器抱怨,因为f.get
方法需要AnyRef
参数。 AFAIK,在Scala中可以安全地转换为AnyRef
- 如果需要,编译器将强制进行必要的装箱。所以我认为这应该有效:f.get(row.asInstanceOf[AnyRef])
编辑:我刚测试了这个并且有效。