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

标签 mysql scala quill quill.io

我有两个 mysql 表:Owners 和 Pets

所有者案例类:

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 和 Pet 上使用 quill join 时,我得到元组列表 [(Owner, Pet)] 如果我的主人几乎没有宠物,我会得到:

    [(主人(1, "john", 30), Pet(3,1,"dog","max")), (主人(1,“约翰”,30),宠物(4,1,“猫”,“雪”))]

    我需要它作为 (Owner(1, "john", 30), [Pet(3,1,"dog","max"), Pet(4,1,"cat","snow ")])

    我怎样才能让它变成这样?

  2. 当我在 Owner & Pet 上使用 join with quill 时,我不会得到没有宠物的主人,这很好,因为这就是它应该的样子,但在我的脚本中,在这种情况下,我想创建对象喜欢:

    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 和许多其他供应商并非如此。

关于mysql - 在 scala 中编写脚本以连接两个 mysql 表并创建一个对象(quill),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53726310/

相关文章:

mysql - 从表中获取唯一的类别/子类别对

javascript - 需要帮助搜索 mysql

MySQL别名简写?

scala - Spark 中的迭代缓存与检查点

javascript - 如何从 quils 获取数据发送到服务器?

javascript - 如何使用Quill存储组成的更改?

node.js - 如何在 Angular 2 中创建一个导入 QuillJS 模块的组件?

mysql - "!= or !="选择一切

json - Play Json : Transforming a Reads[T] to Reads[Seq[T]] without implicits

Scala - 提取器未应用混淆