我的 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, 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, 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 实现这一目标?