如何通过一个请求将不同表中的数据放入单独的列表中

How to put data from various tables into separate lists via one request

例如,我有一些实体。每个实体都有一些属性。 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]

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

对于您的情况,EntityEntityAttribute 的上限是 Product

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

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

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

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