用scala编写脚本,连接两个mysql表并创建一个对象(quill)



我有两个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对象(

我有两个问题:

  1. 当我在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")])

    我怎么能做成这样?

  2. 当我在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对象中。通常,这可以通过groupBymap运算符来完成:

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和许多其他数据库的情况并非如此。

相关内容

  • 没有找到相关文章

最新更新