Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 为Slick 3.1.1创建通用更新功能_Scala_Slick - Fatal编程技术网

Scala 为Slick 3.1.1创建通用更新功能

Scala 为Slick 3.1.1创建通用更新功能,scala,slick,Scala,Slick,我有这个功能: def updateInvoiceAdminStatusField(id: Int, newAdminStatus: AdminStatus): Future[Int] = { db.run { val adminStatus: Query[Rep[AdminStatus], AdminStatus, Seq] = InvoicesTable.filter(invoice => invoice.id === id).map(invoice =&g

我有这个功能:

 def updateInvoiceAdminStatusField(id: Int, newAdminStatus: AdminStatus): Future[Int] = {


    db.run {

      val adminStatus: Query[Rep[AdminStatus], AdminStatus, Seq] = InvoicesTable.filter(invoice => invoice.id === id).map(invoice => invoice.status)

      adminStatus.update(newAdminStatus)
    }
  }
我想让它变得通用:

   def updateInvoiceField[T](id: Int, fieldExtractor: (Invoices) => Rep[T], newValue: T): Future[Int] = {

    db.run {

      val adminStatus = InvoicesTable.filter(invoice => invoice.id === id).map(invoice => {

        fieldExtractor(invoice)
      })

      adminStatus.update(newValue)
    }
  }

但这并不适用于编译。有人能帮忙吗?

差不多了。通过以下小改动,它应该可以工作:

// I added below T: ColumnType
def updateInvoiceField[T: ColumnType](id: Int, fieldExtractor: (Invoices) => Rep[T], newValue: T): Future[Int] = {

  db.run {
      val adminStatus = InvoicesTable.filter(invoice => invoice.id === id).map(invoice => {
          fieldExtractor(invoice)
      })

      adminStatus.update(newValue)
  }
}
注意,我添加了这个
:ColumnType
,这基本上意味着您需要在作用域中有适当的隐式-特别是转换
T
=>
ColumnType[T]
。这仅仅是因为,否则
T
可能是任何东西,
Slick
将无法找到如何转换它

因此,对于
String
Int
等内容,显然您已经有了适当的对话(从profile/driver中的
api
导入)。对于自定义类型,您需要使用
MappedColumnType
来提供正确的转换。下面的示例(类型安全ID):

implicit def columnType[T]: BaseColumnType[Id[T]] =
    MappedColumnType.base[Id[T], Long](toLong, fromLong)

private def fromLong[T](dbId: Long): Id[T] = Id(dbId)

private def toLong[T](id: Id[T]): Long = id.value