我是SLICK(2.1)的新手,在使用union
创建我的第一个查询时迷失了方向。因为参数最终是从外部(通过Web界面)提供的,所以我将它们设置为可选。请参阅以下代码中的评论。如何创建合适的查询?
我的实际课程更复杂,我为了这个问题而简化了。
case class MyStuff(id: Int, value: Int, text: String)
class MyTable (tag: Tag) extends Table[MyStuff](tag, "MYSTUFF"){
def id = column[Int]("ID", O NotNull)
def value = column[Int]("VALUE", O NotNull)
def text = column[String]("TEXT", O NotNull)
def * =
(id,
value,
text).shaped <> ((MyStuff.apply _).tupled, MyStuff.unapply)
}
object myTable extends TableQuery(new MyTable(_)){
def getStuff(ids: Option[List[Int]], values: Option[List[Int]])(implicit session: Session): Option[List[MyStuff]] = {
/*
1) If 'ids' are given, retrieve all matching entries, if any.
2) If 'values' are given, retrieve all matching entries (if any), union with the results of the previous step, and remove duplicate entries.
4) If neither 'ids' nor 'values' are given, retrieve all entries.
*/
}
}
getStuff的调用如下:
db: Database withSession { implicit session => val myStuff = myTable.getStuff(...) }
答案 0 :(得分:1)
如果值为Some,则可以使用inset,否则为文字false,仅当某些值不为None时才使用。
if(ids.isDefined || values.isDefined)
myTable.filter(row =>
ids.map(row.id inSet _).getOrElse(slick.lifted.LiteralColumn(false))
) union myTable.filter(row =>
values.map(row.value inSet _).getOrElse(slick.lifted.LiteralColumn(false))
)
else myTable
答案 1 :(得分:0)
如果我理解正确,您希望在给定输入的运行时构建过滤器。您可以使用&#34;动态过滤器&#34;来构建标准,以查看3.0(http://slick.typesafe.com/doc/3.0.0-RC1/queries.html#sorting-and-filtering)的扩展文档。例如来自webform&#34;。这部分文档也适用于2.1版。