2015-07-16 3 views
28

Я написал этот код, который работает отличноSlick 3,0 Вставка, а затем получить Auto Increment Value

class Items(tag: Tag) extends Table[Item](tag, "ITEMS") { 
    def id = column[Long]("ITEMS_ID", O.PrimaryKey, O.AutoInc) 
    def name = column[String]("ITEMS_NAME") 
    def price = column[Double]("ITEMS_PRICE") 
    def * = (id, name, price) <> ((Item.apply _).tupled, Item.unapply _) 
} 

object Shop extends Shop{ 
    val items = TableQuery[Items] 
    val db = Database.forConfig("h2mem1") 

    def create(name: String, price: Double) : Int = { 
    val action = items ++= Seq(Item(0, name, price)) 
    val future1 = db.run(action) 
    val future2 = future1 map {result => 
     result map {x => x} 
    } 
    Await.result(future2, Duration.Inf).getOrElse(0) 
    } 
} 

Этот код работает, но возвращаемое значение количество записей вставлено. Но я хочу вернуть значение AutoInc после того, как вставка была сделана.

я сделал Google и нашел несколько статей

Slick 3.0.0 AutoIncrement Composite Key

Returning the auto incrementing value after an insert using slick

Но почему-то они не дают ответа на вопрос чисто.

ответ

49

Вот relevant documentation page, согласно которому, вы должны создать запрос, как это:

val insertQuery = items returning items.map(_.id) into ((item, id) => item.copy(id = id)) 

def create(name: String, price: Double) : Future[Item] = { 
    val action = insertQuery += Item(0, name, price) 
    db.run(action) 
} 
+4

+1. Я обнаружил, что [Play-Slick-Silhouette] (https://github.com/sbrunk/play-silhouette-slick-seed) Типичный шаблон Activator - довольно хорошее представление о том, как использовать Slick 3.0 в настройке «real-life» , например [здесь] (https://github.com/sbrunk/play-silhouette-slick-seed/blob/master/app/models/daos/PasswordInfoDAO.scala) и [здесь] (https: // github. com/sbrunk/play-silhouette-slick-seed/blob/master/app/models/daos/UserDAOImpl.scala), включая проблему с возвратом присвоенной личности. –

+0

Если бы я мог дать вам аванс в 100+, я бы это сделал. Это, наверное, самый краткий ответ на этот вопрос, который я видел. –

+2

Это может быть очевидно, но я новичок в slick/scala, в какой переменной хранится столбец автоинкремента? как его получить? – ps0604