1

我正在使用 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 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)
4

1 回答 1

5

一对多的关系在这里很棘手。不确定是否有任何开箱即用的东西可以让 aGetResult能够折叠记录,以便图像 urlUser按用户 ID 聚合在单个记录上。但是您可以通过对您的示例进行一些调整来自己进行此处理:

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]作为usersval。

于 2013-07-25T01:11:29.930 回答