我有两个mysql表:Owners&宠物
业主案例类别:
Owner(id: Int, name: String, age: Int)
宠物箱类别:
Pet(id: Int, ownerId: Int, type: String, name: String)
我想从这些表中创建OwnerAndPets:的列表
case class OwnerAndPets(ownerId: Int,
name: String,
age: String,
pets: List[Pet])
(出于迁移目的,我想将这些表移动为mongodb的集合,集合文档将是OwnerAndPets对象(
我有两个问题:
当我在Owner&宠物我得到元组列表
[(Owner, Pet)]
如果我有几个宠物给主人,我会得到:[(Owner(1, "john", 30), Pet(3,1,"dog","max")), (Owner(1, "john", 30), Pet(4,1,"cat","snow"))]
我需要它作为
(Owner(1, "john", 30), [Pet(3,1,"dog","max"), Pet(4,1,"cat","snow")])
我怎么能做成这样?
当我在Owner&宠物我不会得到没有宠物的主人,这是很好的原因,这就是它应该是什么,但在我的脚本中,在这种情况下,我想创建这样的对象:
OwnerAndPets(Owner(2, "mark", 30), List[])
非常感谢的帮助
这是我的加入查询:
query[Owner].join(query[Pet]).on((o, p) => o.id == p.o_id)
您的问题突出了Quill和Slick等FRM(函数关系映射(系统与Hibernate等ORM之间的主要区别之一。FRM系统的目的不是建立特定于域的对象层次结构,例如OwnersAndPets,而是能够将单个数据库查询转换为某组对象,这些对象可以合理地从单一查询的结果集中提取出来-这通常是一个元组。这意味着您可以将元组(Owner_N, Pet_1-N)
对象连接到内存中的单个OwnersAndPets
对象中。通常,这可以通过groupBy
和map
运算符来完成:
run(query[Owner].join(query[Pet]).on((o, p) => o.id == p.o_id))
.groupBy(_._1)
.map({case (owner,ownerPetList) =>
OwnerAndPets(
owner.id,owner.name,owner.age+"", // Not sure why you made 'age' a String in OwnerAndPets
ownerPetList.map(_._2))
})
也就是说,有一些数据库供应商(例如Postgres(在内部实现数组类型,因此在某些情况下,您可以在数据库级别进行连接,但MySQL和许多其他数据库的情况并非如此。