2015-11-14 3 views
4

У меня есть сложный SQL запрос, выполненный из нескольких объединений/влево присоединяется, которые приводят тип выглядит следующим образом:Mapping Slick SQL Результаты запроса на случай классы

val query = sql""" 
    // body of query 
    """.as[(Long, String, String, Int, Long, Long, String, Int, Option[Int], Option[Int], Option[String], Option[Timestamp], Option[Timestamp])] 

В результате выполнения этого запроса является список кортежей с 10+ свойств. Списка обрабатывается для получения классов случая:

db.run(query).map(_.groupBy { case (p1, p2, p3, p4, _, _, _, _, _, _, _, _, _) => 
    (p1, p2, p3, p4) 
}.map { case ((o1, co2, o3, o4), o5) => 
    CaseClass1(o1, co2, o3, Seq(o4), o5.groupBy { 
    case (_, _, _, _, u1, _, _, _, _, _, _, _, _) => u1 
    }.map { case (t1, t2) => 
    CaseClass2(t1, t2.flatMap { 
     case (_, _, _, _, _, _, _, _, Some(n1), Some(n2), Some(n3), Some(n4), Some(n5)) => Some(CaseClass3(n1, n2, n3, n4, n5)) 
     case _ => None 
    }, t2.map { 
     case (_, _, _, _, _, m1, m2, m3, _, _, _, _, _) => CaseClass4(m1, m2, m3, l1) 
    }) 
    }.toSeq) 
} 

Процесс отображения результирующего набора в случае классы сам по себе не очень расширяемые и дают мне головную боль каждый раз, когда я добавить новое свойство быть выбрано из запроса. Существует ли более простой способ сопоставления набора результатов с классами case?

ответ

3

Да, конечно.

Сначала создайте класс case, чтобы заменить ваш кортеж, назовем его MyMatch.

case class MyMatch(p1: Long, p2: String ...) 

Затем создайте GetResult и получить свой результат с этим классом

implicit val getMyMatch = GetResult(r => MyMatch(r.<<, r.<<, r.<<, ...) 


val query = sql""" 
    // body of query 
    """.as[MyMatch] 

Вы можете использовать GroupBy с новыми свойствами случай класса.

db.run(query).map(_.groupBy { x => (x.p1, x.p2, x.p3, x.p4) } 

flatmap может стать

flatMap { x => for { n1 <- x.n1; n2 <- x.n2 ...} yield CaseClass3(n1, n2, ...) } 
+2

Не вам нужно 'GetResult [MyMatch]' для того, чтобы работать? – dwickern

+0

Да, но это намного легче поддерживать, чем длинные списки (_, _, _) .. Я отредактирую, чтобы добавить это – jazmit

+0

Это выглядит великолепно! Я попробую и дам вам знать, как все прошло. –

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