如何解决用Slick处理具有一对多关系的案例类的最简单方法是什么
我有以下案例课
case class News(
newsId: Option[Long],name: String,description: String,author: String,creationDateTime: Option[OffsetDateTime],images: Option[List[String]]
)
,并希望将Slick用作数据库映射。我能够创建一个有效的DataAccessObject和一个NewsTable
案例类而没有 images: Option[List[String]]
字段。
我真的不知道该如何解决我的问题,所以我希望找到一个简单的指南,说明如何与Slick处理一对多的关系。 (或者,光滑功能是否支持List
中的Strings
即可使用)
我想我应该用tupledJoin解决这个问题,但是我无法解决这个问题。
我认为给定的News
案例类违反了光滑的哲学思想:“建议使用Slick将一个表映射到元组或案例类,而不要让它们具有对相关对象的对象引用。”但我不确定。而且我不想更改此模型,因为它也是我的转移模型的一部分。
此致:)
解决方法
有很多方法可以根据您的要求将此模型建模为SQL,但是我假设一个“新闻对多图像”关系要求。
现在您可以按以下方式对SQL表进行建模
CREATE TABLE news (
id BIGINT NOT NULL AUTO_INCREMENT,name TEXT NOT NULL,/* ... other properties for news,but nothing for image */
PRIMARY KEY (id)
)
CREATE TABLE images (
id BIGINT NOT NULL AUTO_INCREMENT,url TEXT NOT NULL
news_id BIGINT NOT NULL,PRIMARY KEY (id),/* you can decide if you need to a constraint or not */
FOREIGN KEY (news_id) REFERENCES news(id)
)
现在,您的光滑模式看起来像
case class News(
id: Int,name: String
)
case class Image(
id: Int,url: String,newsId: Int
)
class NewsTable(tag: Tag) extends Table[News](tag,"news") {
def id = column[Int]("id",O.PrimaryKey,O.AutoInc)
def name = column[String]("name")
def * = (id,name) <> (News.tupled,News.unapply)
}
class ImagesTable(tag: Tag) extends Table[Image](tag,"images") {
def id = column[Int]("id",O.AutoInc)
def name = column[String]("name")
def newsId = column[Int]("news_id")
def * = (id,name,newsId) <> (Image.tupled,Image.unapply)
}
val newsQuery = TableQuery[NewsTable]
val imagesQuery = TableQuery[ImagesTable]
现在,您可以使用以下查询来获取news id = 22
的新闻和图片
val query =
newsQuery
.joinLeft(imagesQuery)
.on({ case (news,image) => news.id === image.newsId })
.filter({ case (news,_) => news.id === 22 })
val queryAction = query.result.headOption
val newsOptionFuture = db.run(queryAction)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。