我有两个mysql表:owners和pets
业主案例类别:
Owner(id: Int, name: String, age: Int)
宠物箱等级:
Pet(id: Int, ownerId: Int, type: String, name: String)
我想从这些表中创建所有者和数据集列表:
case class OwnerAndPets(ownerId: Int,
name: String,
age: String,
pets: List[Pet])
(出于迁移的目的,我想将这些表移动到mongodb的集合中,集合文档将是ownerdpets对象)
我有两个问题:
当我在owner&pet上使用join with quill时,我得到了元组列表 [(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&pet上使用join with quill时,我不会得到没有宠物的主人,因为这是应该的,但在我的脚本中,在这种情况下,我希望创建如下对象: OwnerAndPets(Owner(2, "mark", 30), List[])
谢谢你的帮助
这是我的加入查询:
query[Owner].join(query[Pet]).on((o, p) => o.id == p.o_id)
1条答案
按热度按时间z2acfund1#
您的问题突出了frm(函数关系Map)系统(如quill和slick)与orms(如hibernate)之间的一个主要区别。frm系统的目的不是构建特定领域的对象层次结构,例如ownersandpets,而是能够将单个数据库查询转换为一些对象集,这些对象集可以合理地从单个查询的结果集中提取出来—这通常是一个元组。这意味着它是由你加入元组
(Owner_N, Pet_1-N)
对象转换为单个OwnersAndPets
内存中的对象。通常可以通过groupBy
以及map
操作员:也就是说,有一些数据库供应商(例如postgres)在内部实现数组类型,因此在某些情况下,您可以在数据库级别执行连接,但mysql和其他许多数据库则不是这样。