2017-02-06 6 views
0

В Slick я могу это сделать:scala slick - как назвать полученные поля?

val joinQuery: Query[(Rep[String], Rep[String]), (String, String), Seq] = for { 
    c <- coffees if c.price > 9.0 
    s <- c.supplier 
    } yield (c.name, s.name) 

Тогда я могу получить доступ к имени, как это:

joinQuery.map(_._1) 

Но я не комфортабельный, используя _1 для доступа к имени.

Есть ли способ, которым я могу назвать полученные поля?

спасибо.

+0

Вы имеете в виду что-то вроде 'joinQuery.map {случай (coffeeName, supName) =>// whatever} '? (обратите внимание на фигурные скобки) –

ответ

2

Ну ... вы можете определить свой класс case для типов результатов и использовать их для форматирования результата запроса.

case class YourQueryResult(coffeeName: String, supplierName: String) 

val joinQuery = for { 
    c <- coffees if c.price > 9.0 
    s <- c.supplier 
} yield (c.name, s.name) 

val joinQueryResultFuture = database.run(joinQuery).map(seq => { 
    seq.map({ case (coffeeName, supplierName) => YourQueryResult(coffeeName, supplierName) }) 
}) 

Но, предположим, что вы хотите в дальнейшем изменить сам запрос, вы можете использовать поиск по шаблону,

val joinQuery = for { 
    c <- coffees if c.price > 9.0 
    s <- c.supplier 
} yield (c.name, s.name) 

val modificationQuery = joinQuery.map({ 
    case (coffeeName, supplierName) => coffeeName 
}) 
+0

Возможно ли это сделать с анонимным классом? –

+0

Мне пришлось создать: case class CoffeeSupliersResult (name: Rep [String], name1: Rep [String]), чтобы он скомпилировался (с Rep [String]). Но он выдает исключение «Не найдено соответствия Shape». –

+0

Я все еще был в середине написания ответа в то время. Каким-то образом опубликовал ответ в полном объеме. –