在 scala 中编写脚本以连接两个 mysql 表并创建一个对象(quill)
writing script in scala to join two mysql tables and create one object (quill)
我有两个 mysql 表:Owners & Pets
所有者案例class:
Owner(id: Int, name: String, age: Int)
宠物箱class:
Pet(id: Int, ownerId: Int, type: String, name: String)
我想从这些表中创建 OwnerAndPets 列表:
case class OwnerAndPets(ownerId: Int,
name: String,
age: String,
pets: List[Pet])
(出于迁移目的,我想将这些表移动为 mongodb 的集合,集合文档将是 OwnerAndPets 对象)
我有两个问题:
当我在 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")])
我怎样才能做到这样?
当我在 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,而是能够将 single 数据库查询转换为一些可以合理地从 single 查询的结果集中提取的对象集- 这通常是一个元组。这意味着将元组 (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 和许多情况并非如此其他
我有两个 mysql 表:Owners & Pets
所有者案例class:
Owner(id: Int, name: String, age: Int)
宠物箱class:
Pet(id: Int, ownerId: Int, type: String, name: String)
我想从这些表中创建 OwnerAndPets 列表:
case class OwnerAndPets(ownerId: Int,
name: String,
age: String,
pets: List[Pet])
(出于迁移目的,我想将这些表移动为 mongodb 的集合,集合文档将是 OwnerAndPets 对象)
我有两个问题:
当我在 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")])
我怎样才能做到这样?
当我在 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,而是能够将 single 数据库查询转换为一些可以合理地从 single 查询的结果集中提取的对象集- 这通常是一个元组。这意味着将元组 (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 和许多情况并非如此其他