代码之家  ›  专栏  ›  技术社区  ›  JohnBigs

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

  •  1
  • JohnBigs  · 技术社区  · 5 年前

    我有两个mysql表:owner&宠物

    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])
    

    我有两个问题:

    1. [(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)
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   Choppy The Lumberjack    5 年前

    您的问题突出了FRM(功能关系映射)系统(如Quill和Slick)与ORM(如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))
      })