代码之家  ›  专栏  ›  技术社区  ›  raoulsson

Slick取消了对对象的更新

  •  0
  • raoulsson  · 技术社区  · 11 年前

    我使用Slick更新提升的实体。此代码更新Contact对象的firstName:

    def updateContact(id: Int, firstName: Option[String]): Unit = {
      val q1 = for {
        c <- Contacts
        if c.id is id
      } yield c.firstName
      // Update value with same or new value
      q1.update(firstName.getOrElse(q1.list().head))
    }
    

    这里的选项对于在值是Some的情况下更新值已经很有用了(尽管如果只有在有新值的情况下才进行更新会更好)。

    我正在寻找的是一种按ID查询对象的方法,然后使用getOrElse在内存中进行所有更新,然后对整个对象进行更新。

    否则,我必须为对象的每个字段运行上面的操作,但你知道,这感觉像是一个肮脏的黑客。

    1 回复  |  直到 11 年前
        1
  •  3
  •   cvogt    11 年前

    而不是 q1.update(firstName.getOrElse(q1.list().head)) 你可以写作 firstName.foreach{ fn => q1.update(fn) } 它更短、更简单,是一个而不是两个查询:)。 使用 foreach 在…上 Option 当你把它看作是一个有一个或零个元素的集合时,它就不再显得奇怪了。

    关于获取整个对象、修改并保存回的想法,您可以这样做:

    def updateContact(id: Int, firstName: Option[String], lastName:Option[String], ...): Unit = {
      val q1 = Query(Contacts).filter(_.id === id)
      val c = q1.first
      val modifiedC = c.copy(
        firstName = firstName.getOrElse(c.firstName),
        lastName = lastName.getOrElse(c.lastName),
        ...
      )
      q1.update(modifiedC)
    }
    

    下面是另一个例子: http://sysgears.com/notes/how-to-update-entire-database-record-using-slick/

    这是一种干净简单的方法,如果性能不是关键任务,这可能是最好的方法,因为它总是传输 Contacts 。您可以通过仅传输选定的列来节省一些流量。

    推荐文章