2012-03-25 9 views
18

Tôi đang sử dụng Scala Play! khuôn khổ với Anorm để duy trì mô hình dữ liệu cho cơ sở dữ liệu. Tôi làm theo các ví dụ mã here:Cách lấy khóa chính khi lưu một đối tượng mới trong 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() 
    } 
    } 

} 

Đang cố gắng để mở rộng nó, tôi muốn lấy khóa chính vừa tạo và lưu trữ nó trong lớp hợp cụ thể.

Làm cách nào tôi có thể truy xuất khóa chính?

Trả lời

35

Sử dụng phương thức executeInsert thay vì executeUpdate. Đã chú ý here, phương thức foremer trả về Option[T] trong đó T là loại khóa chính.

Bạn có thể trích xuất các giá trị với một tuyên bố match:

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

+1 Tôi cố gắng ngày hôm nay – opyate

+3

này chỉ áp dụng nếu khóa chính là một chìa khóa tự động tăng. Nếu không, kết quả sẽ là None –

+0

Ngoài ra, điều này không hoạt động cho 'INSERT IGNORE' nếu không có id được chèn vào. –