我正在使用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
);
Run Code Online (Sandbox Code Playgroud)
和一个看起来像这样的案例类:
case class User(name: String, imageUrls: Array[String])
Run Code Online (Sandbox Code Playgroud)
是否可以编写我的查询并隐式,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)
Run Code Online (Sandbox Code Playgroud)
一对多的关系在这里很棘手.不确定是否有任何开箱即可让GetResult您能够折叠记录,以便图像网址User按用户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)))
Run Code Online (Sandbox Code Playgroud)
完成后,你将有一个Iterable[User]作为usersVAL.