2016-11-29 4 views
1

В основном я хотел бы использовать Slick и в универсальном независимом от DAO пути, вставлять и в то же время извлекать самые последние данные строки сущности.Slick 3.1.x CRUD: как извлечь всю обновленную строку?

Я ранее задал этот вопрос Slick 3.1.x CRUD: how to extract the inserted row id? и в конце концов сумел заставить его работать. Однако такой подход не является оптимальным по следующим причинам:

  • Он предполагает, что каждая модель имеет атрибут id и это не всегда может быть дело. Это работает только для сильных объектов, а не для, например, один-ко-многим слабым объектам и, конечно, нужно называть id всегда, поскольку id является неприятностью.
  • Существуют потенциально другие поля, которые заполняются при вставке, например. возможное modified метка времени или любых модификации триггера пользовательских баз данных, а не только id или modified

Поэтому я хотел бы, чтобы найти решение, которое вставляет новый объект и в то же время извлекает из всего нового Entity строки и а не только id. Так что вместо того, чтобы делать:

val insertQuery = User returning User.map(_.id) into ((row, id) => row.copy(id = id)) 

Есть что-то еще, как:

val insertQuery = User returning User.map(_) into ((row, ???) => row.copy(??? = ???)) 
+2

'Пользователь, возвращающий User.map (_. Id)', может использоваться только в том случае, если id является первичным ключом и автоматически увеличивающим ключ. Также вы не можете вернуть каждый столбец. Вы получите исключение во время выполнения, если попробуете вернуть любое дополнительное увеличение числа экземпляров, первичный ключ ... Чтобы сделать то, о чем вы думаете. Вставить запрос не в место –

+0

Как этот прецедент покрыт Slick? например если у меня нет таблицы, содержащей идентификатор или, что то ли, идентификатор auto-increment? –

+0

@GiovanniAzua после успешной вставки ... вы можете запросить введенные значения. – pamu

ответ

1

То, что мы сделали, чтобы иметь базовый класс для классических, SYNTETIC, автоинкрементного ID BaseDaoAutoInc. В других случаях мы использовали другой базовый класс, который определял (среди прочего) такой метод, как: findById (независимо от того, что этот идентификатор был на самом деле).

Так за исключением случаев, когда мы хотели иметь полный ряд неправдоподобный после вставки (например, когда мы имели некоторые значения, сгенерированные базы данных, например, текущее время и т.д.), что в целом мы сделали, это:

(tableQuery += newEntry).flatMap(_ => findById(newEntry.??))

Выше предполагает у вас нет автогенерированного ключа (и вы знаете его во время ввода). Если вы создали ключ AND и должны прочитать объект после вставки, вам нужно будет добавить эту часть returning в код выше, чтобы сначала получить автогенерированный идентификатор, а затем полную строку.

+0

Wow cool idea ! попробует и примет позже :) Я также закончил разделение Дао на Сильные Существа и Слабые Сущности (я предполагаю, что у всех Сильных сущностей есть первичный ключ auto-increment 'id'), но ваше разделение и именование для разделения имеет больше смысла! Большое спасибо, что поделились! –

+0

Одна деталь ...это не обязательная строка: 'val insertQuery = tableQuery, возвращающий tableQuery.map (_. id) в ((строка, id) => row.copy (id = id))', потому что ваш 'newEntry.id' не является обновлен в памяти после выполнения '+ =' –

+1

Да, он не обновляется. Вот что я упомянул здесь: «Выше предполагается, что у вас нет автогенерированного ключа (и вы знаете его во время вставки). –

Смежные вопросы