2016-10-25 3 views
0

Я пытаюсь вставить, если-не-существует уже использую этот кусок кодаScala/пятна: Получить идентификатор строки вставляется, если не существует уже

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) 

Это работает, но я хочу, чтобы вернуть идентификатор строки (существующей/вставленной). В настоящее время он возвращает логическое значение. Как получить идентификатор без повторного запроса?

ответ

1

Если id является primary key и auto 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 
    } 
} 

Но если id не primary key и auto 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? – srvy

+0

@srvy существующий id 'item.id' может не быть идентификатором базы данных – pamu

+0

@srvy изменил реализацию, просто проверит – pamu