2012-03-25 13 views
18

Sto usando Scala Play! framework con Anorm per mantenere il modello di dati nel database. Ho seguito il codice di esempio here:Come recuperare la chiave primaria quando si salva un nuovo oggetto in Anorm

case class Bar(id: Pk[Long], name: String) 

object Bar { 

    val simple = { 
    get[Pk[Long]]("id") ~ 
    get[String]("name") map { 
     case id~name => Bar(id, name) 
    } 
    } 

    def findAll(): Seq[Bar] = { 
    DB.withConnection { implicit connection => 
     SQL("select * from bar").as(Bar.simple *) 
    } 
    } 

    def create(bar: Bar): Unit = { 
    DB.withConnection { implicit connection => 
     SQL("insert into bar(name) values ({name})").on(
     'name -> bar.name 
    ).executeUpdate() 
    } 
    } 

} 

cercando di espandere su di esso, voglio recuperare la chiave primaria appena creato e memorizzarlo nella classe caso.

Come posso recuperare la chiave primaria?

risposta

35

Utilizzare il metodo executeInsert anziché executeUpdate. Notato here, il metodo foremer restituisce Option[T] dove T è il tipo della chiave primaria.

è possibile estrarre il valore con una dichiarazione match:

DB.withConnection { implicit connection => 
     SQL(...).executeInsert() 
    } match { 
     case Some(long) => long // The Primary Key 
     case None  => ... 
    } 
+2

+1 Ho provato questo oggi – opyate

+3

Questo vale solo se la chiave primaria è una chiave incremento automatico. In caso contrario, il risultato sarà Nessuno –

+0

Inoltre, questo non funziona con 'INSERT IGNORE' se non è stato inserito alcun ID. –

Problemi correlati