написание скрипта в scala для объединения двух таблиц mysql и создания одного объекта (quill) - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть две таблицы mysql: Владельцы и домашние животные

Класс дела владельца:

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)

Iу меня есть две проблемы:

  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. когда я использую соединение сquill on Owner & Pet Я не получу владельцев, у которых нет домашних животных, и это хорошо, потому что это то, чем он должен быть, но в моем сценарии в этом случае я хотел бы создать объект, подобный:

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

Буду признателен за любую помощь, спасибо

это мой запрос на присоединение:

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

1 Ответ

0 голосов
/ 11 декабря 2018

Ваш вопрос подчеркивает одно из основных отличий между системами 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))
  })

Тем не менее, есть некоторые поставщики баз данных (например, Postgres), которые внутренне реализуют типы массивов, поэтому в некоторых случаях вы можете выполнить соединениена уровне базы данных, но это не относится к MySQL и многим другим.

...