我有以下案例类(注意最后一个字段中的选项)
case class BranchVO(sk: Int, name: String, bankSk: Int, bankName: Option[String])
以下类让Slick访问数据库(注意*方法中的None,因为case类有一个额外的last字段):
class BranchDB(tag: Tag) extends Table[BranchVO](tag, "branches") {
def sk: Rep[Int] = column[Int]("sk", O.PrimaryKey, O.AutoInc)
def name: Rep[String] = column[String]("name")
def bankSk: Rep[Int] = column[Int]("bank_sk")
def * = (sk, name, bankSk, None) <> (BranchVO.tupled, BranchVO.unapply)
}
当我尝试在Slick中更新一行时,我得到slick.SlickException: A query for an UPDATE statement must select table columns only -- Unsupported shape: ProductNode
我需要case类来拥有最后一个字段。我可以解决这个问题,创建另一个没有最后一个字段的案例类,但是我试图避免这种情况,是否有解决方法?
答案 0 :(得分:1)
以下是Odomontois(How can I omit case class fields in a slick table mapping?)的解决方案:
type Data = (Long, String, String, Option[String])
def constructUser: Data => User = {
case (id, username, passwordHash, email) => User(id, username, passwordHash, email)
}
def extractUser: PartialFunction[User, Data] = {
case User(id, username, passwordHash, email, _, _) =>
(id, username, passwordHash, email)
}
def * = (id, username, passwordHash, email) <> (constructUser, extractUser.lift)