【问题标题】:writing script in scala to join two mysql tables and create one object (quill)在scala中编写脚本以连接两个mysql表并创建一个对象(quill)
【发布时间】:2018-12-11 14:31:13
【问题描述】:

我有两个 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)] 如果我的主人的宠物很少,我会得到:

    [(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 & Pet 上使用带有 quill 的 join 时,我不会得到没有宠物的所有者,这很好,因为这是它应该是的,但在我的脚本中,在这种情况下,我想创建如下对象:

    OwnerAndPets(Owner(2, "mark", 30), List[])

不胜感激,谢谢

这是我的连接查询:

query[Owner].join(query[Pet]).on((o, p) => o.id == p.o_id)

【问题讨论】:

    标签: mysql scala quill quill.io


    【解决方案1】:

    您的问题突出了 Quill 和 Slick 等 FRM(函数关系映射)系统与 Hibernate 等 ORM 之间的主要区别之一。 FRM 系统的目的不是构建特定域特定的对象层次结构,例如OwnersAndPets,而是能够将 single 数据库查询转换为可以合理地从该 single 查询的结果集中拉出的一组对象 - 这通常是一个元组.这意味着您可以将元组 (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 和许多其他情况,情况并非如此。

    【讨论】:

      猜你喜欢
      • 2017-01-26
      • 2018-12-02
      • 2012-09-03
      • 2014-01-29
      • 2021-01-07
      • 2021-10-04
      • 2019-07-19
      • 2023-03-07
      • 2022-01-24
      相关资源
      最近更新 更多