2015-08-11 6 views
4

Когда я получаю запрос на обновление для данного идентификатора, я пытаюсь обновить столбцы masterId и updatedDtTm в таблице DB (я не хочу обновлять свой createdDtTm) , Ниже мой код:Scala/Slick 3.0.1 - Обновление нескольких столбцов

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()))) 

Когда я компилирую код, он дает мне следующую Compilation Exception:

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())) 

Я использую Scala 2.11 с Slick 3.0.1 и IntelliJ в качестве среды IDE. Очень ценю, если вы можете пролить свет на это.

Приветствие, Sathish

ответ

4

(Заменяет оригинальный ответ) Это кажется неявным должно находиться в области видимости для запросов, это не компилируется:

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()))) 
+0

Спасибо за ваш ответ, но это не отличается от что я пытался раньше, и это также приводит к проблеме компиляции. Следующий снимок экрана в IntelliJ указывает, что query.update ожидает значение: Nothing, а не значение: (String, java.util.Date). –

+0

У вас есть дополнительная пара скобок внутри 'update'. – Ixx

+0

Метод обновления ожидает значения Nothing и, следовательно, если я использую ваш код, IntelliJ Complains говорит слишком много параметров для обновления метода. Еще раз, я использую последнюю версию Slick 3.0.1, похоже, что она работает с slick 2.0, но мой вопрос для Slick 3.0.1 –

 Смежные вопросы

  • Нет связанных вопросов^_^