Я устал всегда делать что-то вроде следующего, чтобы сделать доступ к базе данных, используя пятно для каждого из объектов моего домена.Создание общего DAO для slick
database withSession {
implicit session =>
val entities = TableQuery[EntityTable]
val id = //Some ID
val q = for {
e <- entities if e.id === id
} yield (e)
val entity = q.first
}
(Примечание: EntityTable был определен как описанная here)
Так что я решил, что я хочу, общий объект доступа к базе данных, который обрабатывает это для меня. Использование должно выглядеть как
[...]
val entityDAO = new GenericDAO[Entity, EntityTable, String]()
[...]
database withSession { implicit session =>
val id = // Some ID
val entity = entityDAO.get(id)
}
Мой попытки осуществления в GenericDAO выглядит следующим образом
class GenericDAO[T, TB, PK](implicit session: Session) {
val entities = TableQuery[TB] // Line 1
def get(id: PK): T = {
val q = for {
e <- entities
} yield (e)
val res: T = q.first
res
}
}
Но линия 1 оставляет меня ошибка компилятора о том, что что-то не так с аргументом ТБ.
Множественные маркеры на этой линии - типа аргументы [TB] соответствовать границам ни один из перегруженных вариантов ценностей применяются: [E <: scala.slick.lifted.AbstractTable []] => scala.slick.lifted.TableQuery [Е, Е # TableElementType] [E <: scala.slick.lifted.AbstractTable []] (минусы: scala.slick.lifted.Tag => Е) scala.slick. lifted.TableQuery [E, E # TableElementType] - неверное количество параметров типа для значения перегруженного метода применяется с альтернативами: [E <: scala.slick.lifted.AbstractTable []] => scala.slick.lifted.TableQuery [Е, Е # TableElementType] [E <:
scala.slick.lifted.AbstractTable []] (минусы: scala.slick.lifted.Tag => E) scala.slick.lifted.TableQuery [E, E # TableElementType]
Любые предложения по этому вопросу? Или, может быть, я ошибаюсь, и предполагается, что он будет реализован по-другому. Я открыт для любого решения. Благодаря!
Есть ли также ярлык для удаления строк? Можете ли вы указать ссылку, где можно найти все доступные методы? – Coxer
Вставка/обновление/удаление/запуск/список/первая и т. Д. - это методы ответственных черт Invoker, которые связаны в документах http://slick.typesafe.com/doc/2.0.0/queries.html – cvogt
Работа с ярлыками для всех этих методов. Это просто Скала. Вы просто превращаете метод в функцию и передаете его функции более высокого порядка 'withSession', которая требует функции от сеанса к чему-либо. Просто имейте в виду, что некоторые методы Slick имеют пустой список аргументов, который требует '() (_)', чтобы превратить их в функцию, а некоторые имеют список неявных аргументов, для которого требуется только '(_)'. Например. 'database.withSession (entities.filter (_. id ===/* Some ID * /). delete (_))'. – cvogt