具有映射投影的多列列组

时间:2013-12-13 07:18:46

标签: scala group-by slick

我已经在下面定义了一个包含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
      {
        ????

      }

1 个答案:

答案 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中的正确类型支持可用为止。