【问题标题】:Scala / Slick 3.0.1 - Update Multiple ColumnsScala / Slick 3.0.1 - 更新多列
【发布时间】:2015-08-11 14:17:44
【问题描述】:

每当我收到给定 id 的更新请求时,我都会尝试更新数据库表中的 masterId 和 updatedDtTm 列(我不想更新我的 createdDtTm)。以下是我的代码:

case class Master(id:Option[Long] = None,masterId:String,createdDtTm:Option[java.util.Date],
                      updatedDtTm:Option[java.util.Date])

/**
 * This is my Slick Mapping table
 * with the default projection
 */
`class MappingMaster(tag:Tag) extends
Table[Master](tag,"master") {

    implicit val DateTimeColumnType = MappedColumnType.base[java.util.Date, java.sql.Timestamp](
    {
      ud => new Timestamp(ud.getTime)
    }, {
      sd => new java.util.Date(sd.getTime)
    })
    def id = column[Long]("id",O.PrimaryKey,O.AutoInc)
    def masterId = column[String]("master_id")
    def createdDtTm = column[java.util.Date]("created_dttm")
    def updatedDtTm = column[java.util.Date]("updated_dttm")

    def * = (id.? , masterId , createdDtTm.? , updatedDtTm.?) <>
      ((Master.apply _).tupled , Master.unapply _) }

/**
 * Some where in the DAO update call
 */
db.run(masterRecords.filter(_.id === id).map(rw =>(rw.masterId,rw.updatedDtTm)).
update(("new_master_id",new Date()))

// I also tried the following
db.run(masterRecords.filter(_id === id).map(rw => (rw.masterId,rw.updatedDtTm).shaped[(String,java.util.Date)]).update(("new_master_id",new Date()))

Slick 的文档指出,为了更新多个列,需要使用映射来获取相应的列,然后对其进行更新。

这里的问题如下 - 更新方法似乎接受了 Nothing 的值。

我还尝试了以下与上述相同的操作:

val t = for {
ms <- masterRecords if (ms.id === "1234")
} yield (ms.masterId , ms.updateDtTm)
db.run(t.update(("new_master_id",new Date())))

当我编译代码时,它给了我以下编译异常:

 Slick does not know how to map the given types.
[error] Possible causes: T in Table[T] does not match your * projection. Or you use an unsupported type in a Query (e.g. scala List).
[error]   Required level: slick.lifted.FlatShapeLevel
[error]      Source type: (slick.lifted.Rep[String], slick.lifted.Rep[java.util.Date])
[error]    Unpacked type: (String, java.util.Date)
[error]      Packed type: Any
[error]     db.run(masterRecords.filter(_id === id).map(rw => (rw.masterId,rw.updatedDtTm).shaped[(String,java.util.Date)]).update(("new_master_id",new Date()))

我使用带有 Slick 3.0.1 的 Scala 2.11 和 IntelliJ 作为 IDE。如果您能对此有所了解,我们将不胜感激。

干杯, 萨蒂什

【问题讨论】:

    标签: scala intellij-idea scala-2.11 slick-3.0


    【解决方案1】:

    (替换原始答案)似乎隐含必须在查询范围内,这样编译:

    case class Master(id:Option[Long] = None,masterId:String,createdDtTm:Option[java.util.Date],
                        updatedDtTm:Option[java.util.Date])
    
    implicit val DateTimeColumnType = MappedColumnType.base[java.util.Date, java.sql.Timestamp](
      {
        ud => new Timestamp(ud.getTime)
      }, {
        sd => new java.util.Date(sd.getTime)
      })
    
    class MappingMaster(tag:Tag) extends Table[Master](tag,"master") {
    
    
        def id = column[Long]("id",O.PrimaryKey,O.AutoInc)  
        def masterId = column[String]("master_id")
        def createdDtTm = column[java.util.Date]("created_dttm")
        def updatedDtTm = column[java.util.Date]("updated_dttm")
    
        def * = (id.? , masterId , createdDtTm.? , updatedDtTm.?) <> ((Master.apply _).tupled , Master.unapply _)
    
    }
    
    private val masterRecords = TableQuery[MappingMaster]
    
    val id: Long = 123
    
    db.run(masterRecords.filter(_.id === id).map(rw =>(rw.masterId,rw.updatedDtTm)).update("new_master_id",new Date()))
    
    val t = for {
      ms <- masterRecords if (ms.id === id)
    } yield (ms.masterId , ms.updatedDtTm)
    db.run(t.update(("new_master_id",new Date())))
    

    【讨论】:

    • 感谢您的回答,但这与我之前尝试的没有什么不同,这也会产生编译问题。 IntelliJ 中的以下屏幕截图表明 query.update 需要一个值:Nothing 而不是值:(String,java.util.Date)。
    • 更新方法期望值为 Nothing ,因此如果我使用您的代码,IntelliJ 抱怨说更新方法的参数太多。再一次,我使用的是最新的 Slick 3.0.1,这似乎适用于 slick 2.0,但我的问题是针对 Slick 3.0.1
    • 嗯,我正在使用 Slick 3.0.0
    • 更新期望类型为 Nothing 的参数对我来说没有意义......那么它将如何更新?您使用的是哪个驱动程序?我正在使用 MySQL,更新方法在这里(3.0.1 文档):http://slick.typesafe.com/doc/3.0.1/api/index.html#slick.driver.JdbcActionComponent$UpdateActionExtensionMethodsImpl
    • 如果我按照你的描述在收益中使用元组 - 更新不需要任何东西 [link]snag.gy/rZdVp.jpg 。如果我在产量中只使用一个字符串值 - 那么更新方法需要一个字符串值 [link] snag.gy/QpWV7.jpg
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多