在Slick中创建一个空查询

时间:2016-12-15 13:59:17

标签: scala slick

我有一个引用,我想根据某些条件执行不同的查询,有时会返回导致结果集为空的查询。

def myQuery(something: Boolean): Query[A, B, Seq] = {
  if(something)
    for {
       x <- table
       y <- othertable
       // ...
    } yield a
   else
     Query.empty
}

但是,Query.empty的类型为Query[Unit, Unit, Seq]。让我不得不写这个:

def myQuery(): Query[A, B, Seq] = {
  if(something)
    for {
       x <- table
       y <- othertable
       // other logic yielding a moderatly complex `A` and `B` 
    } yield b
  else
    for {
      x <- table
      y <- othertable
      // Parts of logic copy pasted
      if false
    } yield b
}

是否有更简单/更清晰的方法来生成正确输入的空Query

3 个答案:

答案 0 :(得分:2)

我建议在这种情况下使用Option[Query[A,B,Seq]]作为返回类型,但没有太多上下文。

(自原始答案错误后编辑)

答案 1 :(得分:1)

你可以尝试将你的病情转移到理解本身,如

for {
  x <- table
  y <- othertable
  ...
  if something
} yield b

使用“Hello,Slick”激活模板:

val q = for {
  c <- coffees
  if cond
} yield c

val future = db.run(q.result).map(println)
Await.result(future, Duration.Inf)

condtrue时,会打印

  

背景日志:信息:矢量((哥伦比亚,101,7.99,0,0),(French_Roast,49,8.99,0,0),(浓咖啡,150,9.99,0,0),(Colombian_Decaf,101 ,8.99,0,0),(French_Roast_Decaf,49,9.99,0,0))

false时,

  

后台日志:info:Vector()

Coffees表格def是

class Coffees(tag: Tag)
  extends Table[(String, Int, Double, Int, Int)](tag, "COFFEES")

q的类型被正确推断为Query[Coffees, (String, Int, Double, Int, Int), Seq]

答案 2 :(得分:1)

我遇到了类似的问题,并使用take method解决了这个问题。

def myQuery(): Query[A, B, Seq] = {
    val query = for {
       x <- table
       y <- othertable
       // other logic yielding a moderatly complex `A` and `B` 
    } yield b

    if(something)
        query
    else
        query.take(0)

实际上,Query.empty应该只允许类型参数