Scala 展平Anorm元组列表

Scala 展平Anorm元组列表,scala,anorm,Scala,Anorm,给定一个scala列表,例如: 列表(~(OuterObj,InnerObj1),~(OuterObj,InnerObj2),…) 如果所有OuterObj都相同,而InnerObj可以不同,我需要将其“分组”到一个包含InnerObj列表的OuterObj对象中 换句话说,outerbj有一个属性innerList为空,但我需要将原始列表转换为单个outerbj,以便: OuterObj.innerList = List(InnerObj1, InnerObj2, ....) 我尝试使用.

给定一个scala列表,例如:

列表(~(OuterObj,InnerObj1),~(OuterObj,InnerObj2),…)
如果所有OuterObj都相同,而InnerObj可以不同,我需要将其“分组”到一个包含InnerObj列表的OuterObj对象中

换句话说,
outerbj
有一个属性
innerList
为空,但我需要将原始列表转换为单个outerbj,以便:

OuterObj.innerList = List(InnerObj1, InnerObj2, ....)
我尝试使用
.groupBy(u.\u 1)
,但这并没有正确地对对象进行分组,我也不确定从哪里开始

在上下文有帮助的情况下,原始列表是使用以下解析器模式的一对多(1 outerObj对多innerObj)的Anorm联接查询的结果:

SQL(“使用左连接连接外部与内部SQL”)。as(OuterObj.parse~InnerObj.parse*)//这就是创建元组列表的原因
使用外部连接时,您确实应该有选择地解析内部对象,否则您将丢失没有内部对象的行(除非这是所需的效果)。在这种情况下,您应该:

SQL(...).as(OuterObj.parse ~ (InnerObj.parse ?) *) // List[(A, Option[B])]                    
    .groupBy(_._1)                // Map[A , List[(A, Option[B])]
    .mapValues(_.map(_._2))       // Map[A, List[Option[B]]]
    .toList                       // List[(A, List[Option[B]])]
    .map{ case (parent, children) =>
        parent.copy(
            innerList = children.flatten
        )
    }                             // List[A]
使用外部连接时,您确实应该有选择地解析内部对象,否则您将丢失没有内部对象的行(除非这是所需的效果)。在这种情况下,您应该:

SQL(...).as(OuterObj.parse ~ (InnerObj.parse ?) *) // List[(A, Option[B])]                    
    .groupBy(_._1)                // Map[A , List[(A, Option[B])]
    .mapValues(_.map(_._2))       // Map[A, List[Option[B]]]
    .toList                       // List[(A, List[Option[B]])]
    .map{ case (parent, children) =>
        parent.copy(
            innerList = children.flatten
        )
    }                             // List[A]

我正在使用左外连接。我以为这样可以防止在内部对象不存在时丢失行?你是对的,我不想在没有相应的“内部”权限时丢失“外部”行。查询将保留行,但如果没有看到内部对象(内部解析器不是可选的),则解析器将不会保留行。这将一直持续到mapValues调用:它将返回映射[a,列表[a]]。它似乎在消除B(内部对象)啊,我通过将贴图改为:.map(._2)而不是.map(._1)来修复它。很抱歉。输入错误。我正在使用左外连接。我以为这样可以防止在内部对象不存在时丢失行?你是对的,我不想在没有相应的“内部”权限时丢失“外部”行。查询将保留行,但如果没有看到内部对象(内部解析器不是可选的),则解析器将不会保留行。这将一直持续到mapValues调用:它将返回映射[a,列表[a]]。它似乎在消除B(内部对象)啊,我通过将贴图改为:.map(._2)而不是.map(._1)来修复它。很抱歉。打字错误