Slick Plain SQL неявный GetResult для таблицы с многократным JOIN

Я использую Slick Plain SQL, и у меня есть примерно такая схема таблицы:

CREATE TABLE users (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(191) NOT NULL
);

CREATE TABLE images (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  url VARCHAR(191) NOT NULL,
  user_id INT NOT NULL,
  FOREIGN KEY (user_id) REFERENCES users(id)
  ON DELETE CASCADE ON UPDATE CASCADE
);

и класс case, который выглядит так:

case class User(name: String, imageUrls: Array[String])

Можно ли написать мой запрос и неявный GetResult, чтобы я мог сделать что-то вроде этого:

val u = Q.query[String, User]("""
  SELECT
    users.name, images.url
  FROM
    users
    INNER JOIN images ON images.user_id = users.id
  WHERE
    users.name = ?
""").first(name)

person Joshua Conner    schedule 25.07.2013    source источник


Ответы (1)


Отношения «один ко многим» здесь представляют собой сложную вещь. Не уверен, что есть что-то готовое, позволяющее GetResult свернуть записи, чтобы URL-адреса изображений объединялись в одну запись User по идентификатору пользователя. Но вы можете просто сделать эту обработку самостоятельно с помощью нескольких настроек вашего примера:

case class User(name: String, imageUrls: List[String])

val records = Q.query[String, (String,String)]("""
  SELECT
    users.name, images.url
  FROM
    users
    INNER JOIN images ON images.user_id = users.id
  WHERE
    users.name = ?
""").list(name)  

val users = records.groupBy(_._1).map(tup => User(tup._1, tup._2.map(_._2)))

Когда закончите, у вас будет Iterable[User] в качестве значения users.

person cmbaxter    schedule 25.07.2013