如何通过一个请求将来自各个表的数据放入单独的列表中

时间:2019-05-22 09:04:35

标签: scala doobie

例如,我有一些实体。每个实体都有一些属性。 DB看起来与以下内容有关:

 entity                entity_attribute
╔════╦════════╗       ╔════╦════════════╦═══════════╗
║ id ║ name   ║       ║ id ║ entity_id  ║ attribute ║
╠════╬════════╣       ╠════╬════════════╬═══════════╣
║ 1  ║  One   ║       ║ 1  ║ 1          ║ "aaa"     ║ 
║ 2  ║  Two   ║       ║ 2  ║ 1          ║ "bbb"     ║
║ 3  ║  Three ║       ║ 3  ║ 1          ║ "ccc"     ║
╚════╩════════╝       ║ 4  ║ 1          ║ "ddd"     ║
                      ║ 5  ║ 2          ║ "aa"      ║
                      ║ 6  ║ 2          ║ "bb"      ║
                      ╚════╩════════════╩═══════════╝

我的模型如下:

case class Entity(id: Long, name: String)

case class Entityattribute(id: Long, entityId: Long, attribute: String)

我正在尝试通过doobie获得具有属性(重要:不加入)的实体:

(for {
      entitites <- sql"select id, name from entity"query[Entity].to[List]
      attributes <- (sql"select id, entity_id, attribute from entity_attribute where " ++ 
                    Fragments.in(
                      fr"entity_id", 
                      NonEmptyList.fromListUnsafe(entities.map(_.id)))   //Unsafe, just example
                    ).query[EntityAttribute].to[List]
      } yield entitites ++ attributes).transact(xa)

结果是一个List[Product]

List(
  Entity(1, One),
  Entity(2, Two),
  Entity(3, Three),
  EntityAttribute(1,1,"aaa"),
  EntityAttribute(2,1,"bbb"),
  EntityAttribute(3,1,"ccc"),
  EntityAttribute(4,1,"ddd"),
  EntityAttribute(5,2,"aa"),
  EntityAttribute(6,2,"bb")
)

如何修改doobie请求以将结果分成两个单独的List[Entity]List[EntityAttribute]

1 个答案:

答案 0 :(得分:3)

Scala中的列表是同类的,这意味着编译器将尝试查找列表中所有对象的类型的上限。

对于您来说,EntityEntityAttribute的上限是Product

要保留原始类型,您可以做的只是返回一个包含两个列表的元组:List[Entity]List[EntityAttribute]

} yield (entitites, attributes)).transact(xa)

然后,您可以通过在元组上进行模式匹配来检索列表:

result.map {
   case (entities, attributes) => /* do something */
}