Slick:准备好的查询中的默认参数(限制和范围)

时间:2014-11-13 20:24:41

标签: scala slick slick-2.0

我想在Slick 2.0.x中执行类似的操作:select users with age <= maxAge or if maxAge is None, select all users (limited by a number)。我试过这个:

private def ageQuery(maxAge: Column[Option[Int]], limit: Column[Int]) = {
  Users.filter(user => maxAge.map(_ >= user.age).getOrElse(true)).take(limit)
}

val compiledAgeQuery = Compiled(ageQuery _)

我遇到了以下问题:

  • limitColumn[_],但Users.take需要Int。如果我将其limit更改为Int,那么我就不能再使用Compiled宏了,因为它只需要Column[_]

  • 此代码段本身无法编译:{{1​​}}

1 个答案:

答案 0 :(得分:1)

我找到了以下问题的解决方案:

private def ageQuery(maxAge: Column[Option[Int]] ,limit:  scala.slick.lifted.ConstColumn[Long]) = {
    Users.filter(_.age < maxAge.getOrElse(1000)).take(limit)
}

这就是我所做的:

  1. 我将limit参数的类型更改为scala.slick.lifted.ConstColumn[Long]。现在它满足take方法和Compiled
  2. 我改变了过滤条件。现在它返回所有年龄小于maxAge的用户,当maxAgeNone时,它会返回所有年龄小于1000岁的用户。这是解决方法,但它运作良好(假设没有人超过1000年)