我使用scala 2.11和slick 2.1.0并编译代码:
trait TSegmentClient { this: Profile =>
import profile.simple._
class SegmentClients(tag: Tag) extends Table[(Int, Long)](tag, "seg") {
def segmentId = column[Int]("segment_id")
def clientId = column[Long]("client_id")
def * = (segmentId, clientId)
}
}
segmentClients.insert(clientBehaviors.map(c => (1, c.clientId)))
它有效。
但我需要一个这样的案例类:
case class SegmentClient(segmentId: Int, clientId: Long)
trait TSegmentClient { this: Profile =>
import profile.simple._
class SegmentClients(tag: Tag) extends Table[SegmentClient](tag, "seg") {
def segmentId = column[Int]("segment_id")
def clientId = column[Long]("client_id")
def * = (segmentId, clientId) <> (SegmentClient.tupled, SegmentClient.unapply)
}
}
segmentClients.insert(clientBehaviors.map(c => (1, c.clientId)))
但它没有编译。
(value:models.coper.datamining.SegmentClient)(隐式会话: scala.slick.jdbc.JdbcBackend #SessionDef)Int无法应用于 (scala.slick.lifted.Query [(scala.slick.lifted.Column [INT], scala.slick.lifted.Column [Long]),(Int,Long),Seq]) segmentClients.insert(clientBehaviors.map(c =&gt;(segmentId,c.clientId)))
我的代码出了什么问题?
答案 0 :(得分:3)
您可以使用另一个投影到未映射到案例类的元组。
case class SegmentClient(segmentId: Int, clientId: Long)
trait TSegmentClient { this: Profile =>
import profile.simple._
class SegmentClients(tag: Tag) extends Table[SegmentClient](tag, "seg") {
def segmentId = column[Int]("segment_id")
def clientId = column[Long]("client_id")
def tuple = (segmentId, clientId)
def * = tuple <> (SegmentClient.tupled, SegmentClient.unapply)
}
}
segmentClients.map(_.tuple).insert(clientBehaviors.map(c => (1, c.clientId)))
答案 1 :(得分:0)
第二个示例中insert
上的segmentClients
方法需要SegmentClient
个实例,因为SegmentClients
是mapped table。这就是编译器错误消息基本上所说的。我不知道是否有更惯用的方法,因为我不太了解Slick,但作为一种解决方法你也可以使用:
val behaviours = clientBehaviours.list.map(c => SegmentClient(1, c.clientId))
segmentClients.insertAll(behaviours)