Я пытаюсь сопоставить строку DB с более чем 22 столбцами в дереве классов case. Я бы предпочел не использовать HList, поскольку я не хочу работать с этим API, а также для некоторых экспоненциальных комментариев времени компиляции, которые я где-то читал...
Я прочитал эту тему, на которую ответил Stefan Zeiger: Как я могу обработать > 22 столбец с Slick с использованием вложенных кортежей или HLists?
Я видел этот тест, который показывает, как определить пользовательскую функцию сопоставления, и я хотел бы сделать это:
def * = (
id,
(p1i1, p1i2, p1i3, p1i4, p1i5, p1i6),
(p2i1, p2i2, p2i3, p2i4, p2i5, p2i6),
(p3i1, p3i2, p3i3, p3i4, p3i5, p3i6),
(p4i1, p4i2, p4i3, p4i4, p4i5, p4i6)
).shaped <> ({ case (id, p1, p2, p3, p4) =>
// We could do this without .shaped but then we'd have to write a type annotation for the parameters
Whole(id, Part.tupled.apply(p1), Part.tupled.apply(p2), Part.tupled.apply(p3), Part.tupled.apply(p4))
}, { w: Whole =>
def f(p: Part) = Part.unapply(p).get
Some((w.id, f(w.p1), f(w.p2), f(w.p3), f(w.p4)))
})
Проблема в том, что я не могу это сделать!
Я попытался выполнить меньшие шаги.
class UserTable(tag: Tag) extends TableWithId[User](tag,"USER") {
override def id = column[String]("id", O.PrimaryKey)
def role = column[UserRole.Value]("role", O.NotNull)
def login = column[String]("login", O.NotNull)
def password = column[String]("password", O.NotNull)
def firstName = column[String]("first_name", O.NotNull)
def lastName = column[String]("last_name", O.NotNull)
//
def * = (id, role, login, password, firstName, lastName) <> (User.tupled,User.unapply)
//
def login_index = index("idx_user_login", login, unique = true)
}
Кажется, когда я звоню
(id, (firstName, lastName)).shaped
Тип ShapedValue[(Column[String], (Column[String], Column[String])), Nothing]
В то время как этот, кажется, работает нормально
(id, firstName, lastName).shaped
Параметр типа U не Nothing
, но как ожидалось (String, String, String)
Я не понимаю, как работают все внутренние компоненты Slick. Может кто-нибудь объяснить мне, почему я не могу заставить мой код работать? Есть недостающий импорт или что-то еще?
Я думаю, мне нужно получить значение типа
ShapedValue[(Column[String], (Column[String], Column[String])), (String, (String, String))]
но я не знаю, почему он возвращает меня Nothing
и не понимает, откуда взялись эти неявные параметры Shape
...
Я хочу только, чтобы легко разделить мой столбец на 2 класса case
Спасибо