你不能,有两个原因:
1)val
这发生在编译时,没有Long
价值uid
。userById(uid)
将 a 绑定Long uid
到编译时生成的准备好的语句,然后.list
,.first
等调用查询。
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
在 a 中def
并传入一个运行时变量,这意味着 Slick 必须在每个请求上重新生成 sql,并且没有准备好的语句发送到底层 DBMS . 在某些情况下,您必须这样做,例如传入List(1,2,3)
for inList
。
def whenNothingElseWorks(id: Long) = {
val userFirstNameById = for {u <- userById(id.bind)} yield u.name
}