2016-10-25 3 views
0

存在しない場合、私は挿入-場合-存在しないようにコードスカラ/スリック:行のidが挿入されますすでに

case class Item(name: String, id: Long = 0L) // name is unique 

val data = Query("Bob") 
val exists = items.filter(_.name === "Bob").exists 
val sel = data.filterNot(_ => exists) 
val action = items.map(_.name).forceInsertQuery(sel) 

のこの部分を使用してそれは動作しますが、私はIDを返すようにしたいすでにしようとしています(存在する/挿入された)行の現在はブール値を返します。もう一度問い合わせることなくIDを取得するにはどうすればよいですか?

答えて

1

idprimary keyauto incrementの場合、同じ挿入クエリでidを返すことができます。もしそうでなければ、それは不可能です。

val tableQuery = TableQuery[Items] //items is a slick table 

def getIdAfterInsert(item: Item): DB[Long] = { 
    tableQuery.filter(_.name === item.name).take(1).result.headOption.flatMap { 
    case Some(dbItem) => 
     DBIO.successful(dbItem.id) 
    case None => 
    tableQuery.returning(tableQuery.map(_.id)) += item 
    } 
} 

しかしidprimary keyauto incrementではない場合、あなたは行う必要があります。

def getIdAfterInsert(item: Item): DBIO[Long] = { 
tableQuery.filter(_.name === item.name).take(1).result.headOption { 
    case Some(item) => DBIO.successful(item.id) 
    case None => 
    (tableQuery += item).flatMap { _ => 
     tableQuery.filter(_.name === item.name).take(1).result.id //this is the extra query 
    } 
} 
} 
+0

idは主キーです。-1ではなく既存の行のIDを返すことは可能ですか? – srvy

+0

@srvy既存のid 'item.id'はデータベースIDではない可能性があります – pamu

+0

@srvyは実装を変更しました。 – pamu

関連する問題