光滑2映射许多与mappedColumn一个关系(slick 2 mapping many to o

2019-10-21 00:29发布

我想要我的类映射,包括漂亮的,所以我能坚持他们。 我的业务对象是这样定义的

case class Book(id : Option[Long], author : Author, title : String, readDate : Date, review : String){}
case class Author(id : Option[Long], name : String, surname : String) {}

然后我定义了作者的“表”类:

class Authors(tag : Tag) extends Table[Author](tag,"AUTHORS") {
    def id = column[Option[Long]]("AUTHOR_ID", O.PrimaryKey, O.AutoInc)
    def name = column[String]("NAME")
    def surname = column[String]("SURNAME")
    def * = (id, name, surname) <> ((Author.apply _).tupled , Author.unapply)
}

而对于书籍:

class Books (tag : Tag) extends Table[Book](tag, "BOOKS") {
    implicit val authorMapper = MappedColumnType.base[Author, Long](_.id.get, AuthorDAO.DAO.findById(_))

    def id = column[Option[Long]]("BOOK_ID", O.PrimaryKey, O.AutoInc)
    def author = column[Author]("FK_AUTHOR")
    def title = column[String]("TITLE")
    def readDate = column[Date]("DATE")
    def review = column[Option[String]]("REVIEW")

    def * = (id, author, title, readDate, review) <> ((Book.apply _).tupled , Book.unapply)
}

但是,当我编译我得到这个错误

Error:(24, 51) No matching Shape found.
Slick does not know how to map the given types.
Possible causes: T in Table[T] does not match your * projection. Or you use an unsupported type in a Query (e.g. scala List).
Required level: scala.slick.lifted.FlatShapeLevel
Source type: (scala.slick.lifted.Column[Option[Long]], scala.slick.lifted.Column[model.Author], scala.slick.lifted.Column[String], scala.slick.lifted.Column[java.sql.Date], scala.slick.lifted.Column[Option[String]])
Unpacked type: (Option[Long], model.Author, String, java.sql.Date, String)
Packed type: Any
def * = (id, author, title, readDate, review) <> ((Book.apply _).tupled , Book.unapply)
                                              ^

而且这一个:

Error:(24, 51) not enough arguments for method <>: (implicit evidence$2: scala.reflect.ClassTag[model.Book], implicit shape: scala.slick.lifted.Shape[_ <: scala.slick.lifted.FlatShapeLevel, (scala.slick.lifted.Column[Option[Long]], scala.slick.lifted.Column[model.Author], scala.slick.lifted.Column[String], scala.slick.lifted.Column[java.sql.Date], scala.slick.lifted.Column[Option[String]]), (Option[Long], model.Author, String, java.sql.Date, String), _])scala.slick.lifted.MappedProjection[model.Book,(Option[Long], model.Author, String, java.sql.Date, String)].
Unspecified value parameter shape.
def * = (id, author, title, readDate, review) <> ((Book.apply _).tupled , Book.unapply)
                ^

这里有什么错误? 什么是我没有得到有关华而不实? 先感谢您!

Answer 1:

斯利克不是一个ORM所以有从外键的实体没有自动映射,这个问题已经被问了很多次的SO( 这里 , 这里仅举二)。

让我们假设一下,如果你正在尝试做的是可能的:

implicit val authorMapper = 
  MappedColumnType.base[Author, Long](_.id.get, AuthorDAO.DAO.findById(_))

所以,你告诉使用行ID和获取有关该ID的实体投影,也有你的情况三个问题,第一你不处理故障( id.get ),第二你的主键是可选的(这不该“T是)。

第三个问题是,华而不实将在单独的方式提取每一个实体,我的意思是,你执行一些查询,并得到100本书,华而不实将使其他100个查询只获取相关的实体,表现明智,那就是自杀,你完全绕过它具有最佳性能的SQL层(连接)只具有缩短你的DAO的可能性。

幸运的是这似乎并不可能,映射器用于非支持的类型由光滑(例如不同的日期格式,而不必显式使用的功能)或注入格式转换读取/插入行的情况下,看一下对文档的如何使用连接 (取决于您的版本)。



Answer 2:

恩德NEU的回答更是知识和相关的问题中所描述的用例,而且可能更合适和正确的答案。

以下仅仅是一个观察我做这可能通过回答问题帮助tmnd91:

这里有什么错误?

我注意到:

case class Book( ... review : String){}

不匹配:

def review = column[Option[String]]("REVIEW")

它应该是:

def review = column[String]("REVIEW")


文章来源: slick 2 mapping many to one relationship with mappedColumn