Ответ 1
Не уверен, что это изменилось с ScalaQuery на Slick, но попробуйте:
val q = for{
id <- Parameters[Int]
t <- tableObject if t.id is id
} yield t.id.count
val cnt = q(someID).firstOption getOrElse 0
У меня возникла проблема, которую я хотел бы упростить: (совершенно верно, я делаю это неправильно на самом деле).
Я хотел бы подсчитать количество пользователей, имеющих id = 1. На языке SQL скажем, что это примерно так:
SELECT COUNT(*) FROM users WHERE id = 1
Я использую Slick в форме "поднял", поэтому вот мой фрагмент кода, подсчитывающий пользователей:
Query(Users.where( _.id === 1).length).first
Фактически, что происходит здесь, это то, что Slick alias ScalaQuery фактически создает подзапрос с причиной фильтра и затем подсчитывает результаты подпроса.
SELECT COUNT(*) FROM (SELECT * FROM users WHERE id = 1))
Похоже на довольно большие накладные расходы для такого запроса.
Не уверен, что это изменилось с ScalaQuery на Slick, но попробуйте:
val q = for{
id <- Parameters[Int]
t <- tableObject if t.id is id
} yield t.id.count
val cnt = q(someID).firstOption getOrElse 0