使用Slick提升嵌入时,如何将提升类型更改回Scala类型?

时间:2013-01-31 08:12:55

标签: scala slick

使用提升嵌入时,如何在Slick中解除查询中的值?我希望得到'get','toLong'或其他类似的东西,但没有这样的运气。

以下代码无法编译:

  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

1 个答案:

答案 0 :(得分:4)

你不能,原因有两个:

  

1)val这是在编译时发生的,没有Long   价值uiduserById(uid)Long uid绑定到编译时   生成预准备语句,然后调用.list.first等   查询。

     

2)另一个问题是Parameter ize查询后的问题,   组合不再可能 - 这是一个可以追溯到的限制   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在每个请求上,没有准备好的语句发送到底层DBMS。在某些情况下,您必须执行此操作,例如为List(1,2,3)传递inList

def whenNothingElseWorks(id: Long) = {
  val userFirstNameById = for {u <- userById(id.bind)} yield u.name
}