Scala slick 2.0 updateAll相当于insertALL?

时间:2014-07-22 03:47:36

标签: slick slick-2.0

寻找使用光滑进行批量更新的方法。是否有一个等效的updateAll to insertALL?到目前为止,Goole研究一直没有成功。

我有一个具有不同状态的案例类列表。每个都有不同的数值,所以我无法运行典型的更新查询。同时,我想保存多个更新请求,因为我可能需要同时更新数千条记录。

2 个答案:

答案 0 :(得分:1)

我不清楚你想要实现什么,插入和更新是两个不同的操作,对于插入有意义有一个批量函数,对于更新它不在我看来,实际上在SQL中你可以只是写这样的东西

UPDATE
  SomeTable
SET SomeColumn = SomeValue
WHERE AnotherColumn = AnotherValue

对于SomeColumn等于SomeValue的所有行,使用值AnotherColumn进行更新AnotherValue

Slick这是一个简单的filtermapupdate

相结合
table
  .filter(_.someCulomn === someValue)
  .map(_.FieldToUpdate)
  .update(NewValue)

如果您要更新整行,只需删除map并将Row对象传递给update函数。

编辑:

如果你想更新不同的case类,我会认为这些case类是你的模式中定义的行,如果是这种情况,你可以将它们直接传递给update函数,因为它是如此定义的:

def update(value: T)(implicit session: Backend#Session): Int

对于第二个问题,我不能建议你一个解决方案,看看JdbcInvokerComponent特征,看起来更新函数会立即调用execute方法

def update(value: T)(implicit session: Backend#Session): Int = session.withPreparedStatement(updateStatement) { st =>
  st.clearParameters
  val pp = new PositionedParameters(st)
  converter.set(value, pp, true)
  sres.setter(pp, param)
  st.executeUpdate
}

可能是因为您实际上可以在每个表上运行一个更新查询而不是多个表上的多个更新,如SO question所述,但您当然可以在同一个表上更新多行。

答案 1 :(得分:1)

很抱歉回答我自己的问题,但我最终做的只是下载到JDBC并进行batchUpdate。

  private def batchUpdateQuery = "update table set value = ? where id = ?"

  /**
   * Dropping to jdbc b/c slick doesnt support this batched update
   */
  def batchUpate(batch:List[MyCaseClass])(implicit subject:Subject, session:Session) = {
    val pstmt = session.conn.prepareStatement(batchUpdateQuery)

    batch map { myCaseClass =>
      pstmt.setString(1, myCaseClass.value)
      pstmt.setString(2, myCaseClass.id)
      pstmt.addBatch()
    }

    session.withTransaction {
      pstmt.executeBatch()
    }
  }