Ответ 1
Вы не можете по двум причинам:
1) с
val
это происходит во время компиляции, нетLong
значениеuid
.userById(uid)
связывает aLong uid
со временем компиляции сгенерированный подготовленный оператор, а затем.list
,.first
и т.д. invoke запрос.2) другая проблема возникает, как только вы
Parameter
выберите запрос, композиция уже невозможна - это ограничение, относящееся к ScalaQuery.
Лучше всего отложить Parameter
до окончательного скомпонованного запроса:
val forFooBars = for{
f <- Foos
b <- Bars if f.id is b.fooID
} yield(f,b)
val allByStatus = for{ id ~ active <- Parameters[(Long,Boolean)]
(f,b) <- forFooBars if (f.id is id) && (b.active is active)
} yield(f,b)
def findAllByActive(id: Long, isActive: Boolean) = allByStatus(id, isActive).list
Во всяком случае, в вашем примере вы могли бы так же хорошо:
val byID = Users.createFinderBy(_.id)
Единственный способ, с помощью которого я могу работать, это обернуть запрос val
в def
и передать переменную среды выполнения, что означает, что Slick должен повторно генерировать sql для каждого запроса, и никакой подготовленный оператор не отправляется в базовую СУБД. В некоторых случаях вам нужно сделать это, например, передать List(1,2,3)
для inList
.
def whenNothingElseWorks(id: Long) = {
val userFirstNameById = for {u <- userById(id.bind)} yield u.name
}