如何通过一个请求将不同表中的数据放入单独的列表中
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 中的列表是同类的,这意味着编译器将尝试找到列表中所有对象类型的上限。
对于您的情况,Entity
和 EntityAttribute
的上限是 Product
。
要保留原始类型,您可以做的只是返回一个包含两个列表的元组:List[Entity]
和 List[EntityAttribute]
。
} yield (entitites, attributes)).transact(xa)
然后您可以通过对元组进行模式匹配来检索列表:
result.map {
case (entities, attributes) => /* do something */
}
例如,我有一些实体。每个实体都有一些属性。 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 中的列表是同类的,这意味着编译器将尝试找到列表中所有对象类型的上限。
对于您的情况,Entity
和 EntityAttribute
的上限是 Product
。
要保留原始类型,您可以做的只是返回一个包含两个列表的元组:List[Entity]
和 List[EntityAttribute]
。
} yield (entitites, attributes)).transact(xa)
然后您可以通过对元组进行模式匹配来检索列表:
result.map {
case (entities, attributes) => /* do something */
}