scala – Slick:使用获取列名来查询多个表/数据库

发布时间:2020-10-21 发布网站:编程之家
编程之家收集整理的这篇文章主要介绍了scala – Slick:使用获取列名来查询多个表/数据库编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的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

总结

以上是编程之家为你收集整理的scala – Slick:使用获取列名来查询多个表/数据库全部内容,希望文章能够帮你解决scala – Slick:使用获取列名来查询多个表/数据库所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入编程之家官方QQ群:1065694478
编程之家官方公众号

微信公众号搜索 “ 程序精选 ” ,选择关注!

微信公众号搜索 “ 程序精选 ”
精选程序员所需精品干货内容!