scala – Slick:使用获取列名来查询多个表/数据库
发布时间:2020-12-16 08:48:40 所属栏目:安全 来源:网络整理
导读:我的Play应用程序中有方法查询数据库表超过一百列.我不能为每个这样的查询定义案例类,因为它只是非常大而且必须随着数据库中表的每个变更而改变. 我正在使用这种方法,其中查询的结果如下所示: Map(columnName1 - columnVal1,columnName2 - columnVal2,...)
我的Play应用程序中有方法查询数据库表超过一百列.我不能为每个这样的查询定义案例类,因为它只是非常大而且必须随着数据库中表的每个变更而改变.
我正在使用这种方法,其中查询的结果如下所示: Map(columnName1 -> columnVal1,columnName2 -> columnVal2,...) 代码示例: implicit val getListStringResult = GetResult[List[Any]] ( r => (1 to r.numColumns).map(_ => r.nextObject).toList ) def getSomething(): Map[String,Any] = DB.withSession { val columns = MTable.getTables(None,None,None).list.filter(_.name.name == "myTable").head.getColumns.list.map(_.column) val result = sql"""SELECT * FROM myTable LIMIT 1""".as[List[Any]].firstOption.map(columns zip _ toMap).get } 当查询仅在单个数据库和单个表上运行时,这不是问题.我需要能够在我的查询中使用多个表和数据库,如下所示: def getSomething(): Map[String,Any] = DB.withSession { //The line below is no longer valid because of multiple tables/databases val columns = MTable.getTables(None,None).list.filter(_.name.name == "table1").head.getColumns.list.map(_.column) val result = sql""" SELECT * FROM db1.table1 LEFT JOIN db2.table2 ON db2.table2.col1 = db1.table1.col1 LIMIT 1 """.as[List[Any]].firstOption.map(columns zip _ toMap).get } 不能再使用相同的方法来检索列名.使用PHP PDO或Java JDBCTemplate之类的东西时不存在这个问题 – 这些检索列名称无需任何额外的工作. 我的问题是:我如何用Slick实现这一目标? 解决方法import scala.slick.jdbc.{GetResult,PositionedResult} object ResultMap extends GetResult[Map[String,Any]] { def apply(pr: PositionedResult) = { val rs = pr.rs // <- jdbc result set val md = rs.getMetaData(); val res = (1 to pr.numColumns).map{ i=> md.getColumnName(i) -> rs.getObject(i) }.toMap pr.nextRow // <- use Slick's advance method to avoid endless loop res } } val result = sql"select * from ...".as(ResultMap).firstOption (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |