Возврат ID AutoInc после вставки в Slick 2.0

Я искал ответ на этот вопрос на краю земли. Информации о slick 2.0 не так много. Ниже приведен мой код для моей модели адресов. Как мне создать метод, возвращающий идентификатор после вставки?

package models
import play.api.Play.current
import play.api.db.slick.Config.driver.simple._
import play.api.db.slick.DB

    object Addresses{
      val DB_URL:String = "jdbc:h2:mem:fls-play"
      val DB_driver:String = "org.h2.Driver"
      class Addresses(tag: Tag) extends Table[(String, String, String, String, String)](tag, "ADDRESSES"){
       def id = column[Int]("ID", O.PrimaryKey, O.AutoInc)
       def city = column[String]("CITY")
       def stateName = column[String]("STATE_NAME")
       def street1 = column[String]("STREET1")
       def street2 = column[String]("STREET2")
       def zip = column[String]("ZIP")

       def * = (city, stateName, street1, street2, zip)
      }
      val addresses = TableQuery[Addresses]

      def create(city:String, stateName:String, street1:String, street2:String, zip:String) {
        DB.withSession{ implicit session =>
           addresses += (city, stateName, street1, street2, zip)
        }
      }
    }

Спасибо!


person James Little    schedule 19.02.2014    source источник
comment
@barnesjd Я думаю, что этот ответ касается гладкости 1.0.   -  person Martin Kolinek    schedule 20.02.2014
comment
@MartinKolinek ах, действительно ... Хороший улов.   -  person joescii    schedule 20.02.2014


Ответы (2)


Пытаться

(addresses returning addresses.map(_.id)) += (city, stateName, street1, street2, zip)

не проверял, но показано здесь

person Martin Kolinek    schedule 19.02.2014
comment
Большое спасибо, я не могу поверить, что пропустил это. - person James Little; 21.02.2014
comment
@Martin, так ты ответил на тело вызова метода? Разве вы не можете использовать tuple, чтобы как-то уменьшить код? Мне не нравится, как мы должны повторять столбцы. Надеюсь, вы могли бы уточнить, где этот код на самом деле принадлежит? Это в том же месте, что и метод * =? - person Blankman; 29.05.2014
comment
@Blankman, если у вас уже есть кортеж столбцов, вы сможете использовать что-то вроде (add returning add.map(_.id)) += tuple. Если это то, о чем вы спрашиваете. - person Martin Kolinek; 29.05.2014
comment
Кстати, чтобы отобразить результат использования returning (например, чтобы вставить только определенные столбцы), вы должны использовать map до использования returning. Затем вы можете вызвать insert как обычно. Например, addresses.map(row => (row.name, row.desc)).returning(addresses.map(_.id)).insert(("Name", "Desc")) - person Kat; 24.12.2014
comment
Почему userId (во фрагменте документа) имеет тип FixedSqlAction[Int, NoStream, Effect.Write]? Как получить идентификатор из этого? - person User; 08.06.2015

Если у вас есть поля со значениями по умолчанию, вы можете попробовать это

addresses.map(c => (c.city, c.stateName, c.street1)) returning addresses.map(_.id) += (city, stateName, street1)
person andemi    schedule 18.11.2014
comment
Хороший! Я искал это. Спасибо - person brunofitas; 17.07.2015