Scala 从选择滑动插入

Scala 从选择滑动插入,scala,slick,Scala,Slick,我使用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")

我使用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类SegmentClient(segmentId:Int,clientId:Long)
trait TSegmentClient{this:Profile=>
导入profile.simple_
类SegmentClient(标记:标记)扩展表[SegmentClient](标记,“seg”){
def段id=列[Int](“段id”)
def clientId=列[Long](“客户端id”)
def*=(segmentId,clientId)(SegmentClient.tuple,SegmentClient.unapply)
}
}
segmentClients.insert(clientBehaviors.map(c=>(1,c.clientId)))
但它没有编译

(值:models.coper.datamining.SegmentClient)(隐式会话: 无法将scala.slick.jdbc.jdbcbbackend#SessionDef)Int应用于 (scala.slick.lifted.Query[(scala.slick.lifted.Column[Int], scala.slick.lifted.Column[Long],(Int,Long),Seq]) 插入(clientBehaviors.map(c=>(segmentId,c.clientId)))


我的代码有什么问题?

第二个示例中
segmentClients
上的
insert
方法需要一个
SegmentClient
实例,因为
segmentClients
是一个实例。这就是编译器错误消息的基本意思。我不知道是否有更惯用的方法,因为我不太了解Slick,但作为一种解决方法,您也可以使用:

val behaviours = clientBehaviours.list.map(c => SegmentClient(1, c.clientId))
segmentClients.insertAll(behaviours)

您可以使用对未映射到case类的元组的另一个投影来实现这一点

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)))
case类SegmentClient(segmentId:Int,clientId:Long)
trait TSegmentClient{this:Profile=>
导入profile.simple_
类SegmentClient(标记:标记)扩展表[SegmentClient](标记,“seg”){
def段id=列[Int](“段id”)
def clientId=列[Long](“客户端id”)
def tuple=(segmentId,clientId)
def*=元组(SegmentClient.tuple,SegmentClient.unapply)
}
}
segmentClients.map(u.tuple).insert(clientBehaviors.map(c=>(1,c.clientId)))

您的代码未编译,我可以这样做:
for(c段客户机需要Int,Long,但c.clientId是scala.slick.lifted.Column[Long]为
c.clientId
设置
意味着您仍然在查询中,但是
列表
应该返回
列表
,该列表是
clientBehavior
表映射到的任何对象。您是否也可以发布
clientBehavior
的实际类型。也许我遗漏了一些内容,但看起来好像您错过了什么没有调用
list
。您是否已经尝试了cvogt的建议?def tuple=(segmentId,clientId);def*=tuple(SegmentClient.tuple,SegmentClient.unapply)和SegmentClient.tuple.insert(…)?抱歉,我不明白。在我的示例2中,我需要更改
def*=(segmentId,clientId)(SegmentClient.tuple,SegmentClient.unapply)
to
tuple=(segmentId,clientId);def*=tuple(SegmentClient.tuple,SegmentClient.unapply)
然后执行
segmentClients.tuple.insert(clientBehaviors.map(c=>(1,c.clientId)))
?编译器说,值元组不是scala.slick.lifted.tablequery的成员。我错了,请使用:segmentClients.map(u.tuple)。insert(…)Greate!它可以工作,谢谢!请添加您的答案,这样我就可以标记itHey@cvogt。在slick 3+中,正确的方法是什么?请尝试forceInsertQuery。请参阅本文的最后一部分
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)))