В моем приложении Play есть методы, которые запрашивают таблицы базы данных с более чем сотней столбцов. Я не могу определить класс case для каждого такого запроса, потому что он был бы просто смехотворно большим и его нужно было бы менять при каждом изменении таблицы в базе данных.
Я использую этот подход, когда результат запроса выглядит так:
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?