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