我已经在下面定义了一个包含7个表的查询。从几个表中选择的列的数量超过了22的限制,因此定义的投影如下所示。查询还需要在某些列上有一个分组,但我无法弄清楚如何按功能分组应用映射投影。
implicit s =>
val query = for
{
(t1, t2) <- Table1 leftJoin Table2 on
(_.t1A === _.t2A)
(t3, t4) <- Table3 leftJoin Table4 on (_.t3A === _.t4A)
t5 <- Table5 if t1.t1B === t5.t5B
t6 <- Table6 if t6.t6C === t4.t4C && t6.t6D === t5.t5D
rit <- Table7 if t7.t7E === t1.t1E
} yield (t1.t1A ~ t1.t1B ~ t1.t1C ~ t1.t1D ~
t1.t1E ~ t1.t1F ~ t1.t1G ~ t1.t1H ~
t1.t1I.? ~ t1.t1J ~ t1.t1K ~ t1.t1L ~
t1.t1M ~ t1.t1N <>(Table1Rec1.apply _, Table1Rec1.unapply _),
t1.t1O ~ t1.t1P ~ t1.t1Q ~ t1.t1R ~
t1.t1S ~ t1.t1T ~ t1.t1U ~ t1.t1V ~
t1.t1W ~ t1.t1X ~ t1.t1Y ~ t1.t1Z <>(Table1Rec2.apply _,
Table1Rec2.unapply _),
t1.t1AA ~
t1.t1AB ~ t1.t1AC ~ t1.t1AD ~ t1.t1AE ~
t1.t1AF ~ t1.t1AG.? ~ t1.t1AH ~ t1.t1AI.? <>(Table1Rec3
.apply _, Table1Rec3.unapply _),
t2.t2A ~ t2.t2B ~ t2.t2C ~ t2.t2D ~ t2.t2E ~ t2.t2F ~ t2
.t2G <>(Table2Rec1.apply _, Table2Rec1.unapply _),
t3.t3A ~ t3.t3B ~ t3.t3C ~ t3.t3D <>(Table3Rec1.apply _, Table3Rec1.unapply _),
t4.t4A.? ~ t4.t4B ~ t4.t4C <>(Table4Rec1.apply _, Table4Rec1.unapply _),
t5.t5A ~ t5.t5B <>(Table5Rec1.apply _,
Table5Rec1.unapply _),
t6.t6A ~ t6.t6B <>(Table6Rec1.apply _, Table6Rec1.unapply _),
t7.t7A ~ t7.t7B <>(Table7Rec1.apply _, Table7Rec1.unapply _)
)
val query2 = query.groupBy(????).map
{
????
}
答案 0 :(得分:0)
怎么样
query.groupBy(_._1._1 /*t1A*/).map{ case (key,groups) => groups.map(_._2._2/*t1P*/).sum }
请注意,Slick 1.0.1中的groupBy中存在一些已知错误。此外,如果您遇到类似“读取NULL值”的异常,原因是,Slick当前无法自动处理外部联接带来的类型更改。外连接使一个通常不可为空的类型突然可以为空,如果实际找到null,则Slick会抛出一个惊讶的异常。这将在Slick的未来版本中修复。现在,您必须明确地在非可空列上调用.?
,这些列可能已变为null。因此,您的映射器也无法正常工作,因为它们会将列读为不可空的。解决方法模式在此处实现,例如:https://github.com/freekh/play-slick/blob/f7256162b88b9e914dfce3eb1a5955005414ae4d/samples/computer-database/app/models/Models.scala#L113但是如此大量的列将会很繁琐。考虑代码生成。
相关答案 Slick left/right/outer joins with Option Slick left outer join fetching whole joined row as option
我的Scala eXchange 2013演讲中也提到了这个主题,在这里我将展示如何在Slick 2.0中使用代码生成来缓解这种情况,直到Slick中的正确类型支持可用为止。