Сопоставьте таблицу с более чем 22 столбцами с классом case Scala от Slick 2.1.0

Я использую Scala 2.11, Slick 2.1.0-M2, PlayFramework 2.3.1.

Мне нужно сопоставить таблицу из 25 столбцов с классом case Scala.

Например, у меня есть этот класс case:

case class Test(f1: Long, f2: String, f3: String, f4: String, f5: String, 
                f6: String, f7: String, f8: String, f9: String, f10: String, 
                f11: String, f12: String, f13: String, f14: String, f15: String, 
                f16: String, f17: String, f18: String, f19: String, f20: String, 
                f21: String, f22: String, f23: Float, f24: Float, f25: String)

Я читал, что можно написать собственный Shape (доказательство), но все мои попытки понять это терпят неудачу.

Пожалуйста, помогите мне сопоставить этот класс case с таблицей.


person Lunigorn    schedule 13.07.2014    source источник
comment
Дубликат заголовка stackoverflow.com/questions/19636611/   -  person om-nom-nom    schedule 13.07.2014
comment
Это не дублирование, потому что ничего про Shape там нет.   -  person Lunigorn    schedule 13.07.2014
comment
Не дублирование, потому что в этом вопросе задаются классы случаев › 22 столбца, что является новой функцией в Scala 2.11.   -  person cvogt    schedule 14.07.2014
comment
какое-нибудь обновление здесь, может быть, в Slick 3.0?   -  person Ossip    schedule 16.01.2015


Ответы (3)


Для текущей гладкой версии нет хорошего решения этого вопроса. Вы можете упаковать несколько полей в один класс case.

Пожалуйста, обратитесь к этому тестовому примеру.

https://github.com/slick/slick/blob/2.1.0-RC1/slick-testkit/src/main/scala/com/typesafe/slick/testkit/tests/JdbcMapperTest.scala#L99

person liutao    schedule 14.07.2014
comment
Я видел это решение, и я думаю, что его очень плохо поддерживать. Я думаю, что реализация черты Shape будет намного лучше. Но я не могу сделать его крепким. - person Lunigorn; 15.07.2014

На самом деле это можно сделать через HList вот так

def * = (col1 :: col2 :: .. :: HNil).shaped <> (
{ case x => new YYY(x(0), x(1), ..)}, 
{ x: YYY => Option(x.col1 :: x.col2 :: .. :: HNil)}
)

Я написал макрос для отображения, вы можете взглянуть на это https://github.com/jilen/slickext

person jilen    schedule 27.04.2015

У меня есть HListCaseClassShape, который работает точно так же, как CaseClassShape, но без 22 ограничение столбцов: здесь. Затем вы можете сопоставить его со своей таблицей следующим образом: def * = MyHListCaseClassShape(f1, f2, f3...) (см. пример Pair * здесь). Не уверен, что это сработает со Slick 2, но попробовать стоит.

person Choppy The Lumberjack    schedule 21.11.2016