我希望这是一个关于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也是可能的。
致以最诚挚的问候,
戴夫
答案 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
。