Anorm Scala Разница между executeUpdate и executeInsert

Я ломал голову над разницей между использованием 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 (не удается преобразовать 2013-04-15 13:58:46.0: class java.sql.Timestamp в Long для столбца ColumnName (density_cache.day_of, Some (day_of)))

Но когда я переключаюсь на executeUpdate(), все работает нормально.


person Ray H    schedule 15.04.2013    source источник


Ответы (1)


Разница в том, что executeInsert вернет автоматически сгенерированный ключ (если он есть).

Anorm, простой доступ к данным SQL => Выполнение запросов SQL

Если вы вставляете данные с автоматически сгенерированным первичным ключом Long, вы можете вызвать executeInsert(). Если у вас более одного сгенерированного ключа или он не является длинным, executeInsert можно передать ResultSetParser, чтобы вернуть правильный ключ.

В вашем случае я предполагаю/предполагаю, что у вас нет первичного ключа с автоинкрементом, и поэтому он не будет работать с executeInsert(). Если да, то вам, возможно, придется передать ResultSetParser с правильным типом.

person maba    schedule 16.04.2013