我一直在为使用executeUpdate()executeInsert()之间的区别而争论不休。

在以下代码中,我使用了executeInsert()

def addEntry(day: DateMidnight, create_time: DateTime, points: Long, src: String) = DB.withTransaction { implicit connection =>

    Logger.debug("I got here")
    SQL(
      """
        INSERT INTO density_cache(day_of, create_time, points, src)
           VALUES ({day_of}, {create_time}, {points}, {src})
      """
    ).on(
      'day_of       -> day,
      'create_time  -> create_time,
      'points       -> points,
      'src          -> src
    ).executeInsert()
    Logger.debug("Got to 2nd step")
}


我遇到以下问题:
Java.lang.RuntimeException:TypeDoesNotMatch(无法将列ColumnName(density_cache.day_of,Some(day_of))的java.sql.Timestamp类转换为Long

但是当我切换到executeUpdate()时,它可以正常工作。

最佳答案

区别在于executeInsert将返回自动生成的密钥(如果有)。

Anorm, simple SQL data access => Executing SQL queries


如果要插入具有自动生成的Long主键的数据,则可以调用executeInsert()。如果生成的密钥不止一个,或者不是Long,则可以将executeInsert传递给ResultSetParser以返回正确的密钥。


在您的情况下,我猜/假设您没有自动递增的主键,因此它不适用于executeInsert()。如果有,则可能必须传递正确类型的ResultSetParser

10-04 15:06