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

yquaqz18  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(230)

我有两个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)
9w11ddsr

9w11ddsr1#

您的问题突出了frm(函数关系Map)系统(如quill和slick)与orms(如hibernate)之间的一个主要区别。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和其他许多数据库则不是这样。

相关问题