我有一个引用,我想根据某些条件执行不同的查询,有时会返回导致结果集为空的查询。
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
?
答案 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)
当cond
为true
时,会打印
背景日志:信息:矢量((哥伦比亚,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应该只允许类型参数