转换/重新打包Slick查询的结果

时间:2013-10-22 16:05:22

标签: scala slick

我希望这是一个关于Slick的简单问题。如果有详细记录,请道歉 - 我可能在我的搜索中忽略了一些东西。

我有一个如下构建的聚合查询:

def doQuery(/* ... */) = for {
  a <- Query(TableA)
  b <- a.relationship.where // ...
  c <- b.relationship.where // ...
} yield (a, b, c)

这会给我一个Query[(A, B, C)]

我还有一个案例类:

case class Aggregate(a: A, b: B, c: C)

我想将查询转换为Query[Aggregate],以便我的其他开发人员可以致电.list().firstOption()并获得List或{{1}酌情。

我自然而然地选择Option上的.map()方法,但它有一个隐含的Query参数,我不确定如何处理。

Slick中这是否直截了当?我们目前正在使用v1.0.1,但升级到2.0也是可能的。

致以最诚挚的问候,

戴夫

2 个答案:

答案 0 :(得分:3)

经过大量的游戏,我得出结论,这在Slick 1中是不可能的。

在Slick 2中,你可以使用<>运算符来转换在for comprehension的yield部分中组合的投影:

def doQuery(/* ... */) = for {
  a <- Query(TableA)
  b <- a.relationship.where // ...
  c <- b.relationship.where // ...
} yield (a, b, c) <> (Aggregate.tupled, Aggregate.unapply)

这与.list.firstOption一起按预期工作。我不确定尝试使用.insert.update.delete会产生什么后果。

答案 1 :(得分:0)

如果您可以修改doQuery,那么您只想yield Aggregate(a, b, c)代替yield (a, b, c)

或者,如果您想在不修改doQuery的情况下转换结果,那么您可以在.map { case (a, b, c) => Aggregate(a, b, c) }的结果上调用doQuery