2013-03-03 10 views
26

Chcę zmusić do tworzenia zapytań zręczny jakJak tworzą skupiska ze śliskiego

select max(price) from coffees where ... 

Ale slick's documentation nie pomaga

val q = Coffees.map(_.price) //this is query Query[Coffees.type, ...] 
val q1 = q.min // this is Column[Option[Double]] 
val q2 = q.max 
val q3 = q.sum 
val q4 = q.avg 

Bo ci Q1-Q4 nie są pytania, mogę nie uzyskają wyników, ale mogą je wykorzystać w innych zapytaniach.

To stwierdzenie

for { 
    coffee <- Coffees 
} yield coffee.price.max 

generuje właściwą zapytanie ale jest przestarzałe (generuje ostrzeżenie: "Metoda max w ColumnExtensionMethods klasowych jest przestarzała: Używaj Query.max zamiast"). Jak wygenerować takie zapytanie bez ostrzeżeń?

Inną kwestią jest do agregowania z grupy przez:

"select name, max(price) from coffees group by name" 

Próbowano rozwiązać go

for { 
    coffee <- Coffees 
} yield (coffee.name, coffee.price.max)).groupBy(x => x._1) 

który generuje

select x2.x3, x2.x3, x2.x4 from (select x5."COF_NAME" as x3, max(x5."PRICE") as x4 from "coffees" x5) x2 group by x2.x3 

który powoduje błąd oczywisty db

column "x5.COF_NAME" must appear in the GROUP BY clause or be used in an aggregate function 

Jak wygenerować takie zapytanie?

Odpowiedz

30

O ile mogę powiedzieć to pierwsza po prostu

Query(Coffees.map(_.price).max).first 

A druga

val maxQuery = Coffees 
    .groupBy { _.name } 
    .map { case (name, c) => 
    name -> c.map(_.price).max 
    } 

maxQuery.list 

lub

val maxQuery = for { 
    (name, c) <- Coffees groupBy (_.name) 
} yield name -> c.map(_.price).max 

maxQuery.list 
+4

zamiast '.list.head' cię mogę zrobić '.first', IIRC –

+0

Dzięki, zmieniłem to w odpowiedzi – EECOLOR

+0

Dzięki, oba przykłady działają, drugi generuje optymalne zapytanie "wybierz x2." COF_NAME ", maks. (x2." PRICE ") z" kaw "x2 grupa x2." COF_NAME "", ale pierwsza generuje "wybierz x2.x3 z (wybierz maks. (x4. x5) jako x3 z (wybierz x6. "PRICE" jako x5 z "coffees" x6) x4) x2 "- zapytanie z 2 podkwerendami zamiast prostego" wybierz max (x2. "PRICE") z "coffees" x2 "czyli generowane przez przestarzałe API. Wygląda na to, że sprytni programiści zbyt wcześnie wycofali ten api. – Jeriho

Powiązane problemy