使用提升嵌入时,如何在Slick中解除查询中的值?我希望一个'得到','长'或类似的东西可以做到这一点,但没有这样的运气.
以下代码无法编译:
val userById = for {
uid <- Parameters[Long]
u <- Users if u.id === uid
} yield u
val userFirstNameById = for {
uid <- Parameters[Long]
u <- userById(uid)
---------------^
// type mismatch; found : scala.slick.lifted.Column[Long] required: Long
} yield u.name
Run Code Online (Sandbox Code Playgroud)
你不能,有两个原因:
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
Run Code Online (Sandbox Code Playgroud)
无论如何,在你的例子中你也可以这样做:
val byID = Users.createFinderBy(_.id)
Run Code Online (Sandbox Code Playgroud)
我知道让这种事情发挥作用的唯一方法是将查询包装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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2275 次 |
| 最近记录: |