2013-02-12 12 views
8

Próbuję utworzyć kwerendę z Slick 1.0.0, która zwraca liczyć wiersz równoważne następującym SQL:Hrabia wiersze z Slick 1.0.0

SELECT COUNT(*) FROM table; 

Co mam tak daleko jest:

val query = for { 
    row <- Table 
} yield row 
println(query.length) 

To drukuje [email protected]. Ponadto, query.length wydaje się być typu scala.slick.lifted.Column. Nie mogę znaleźć sposobu na wykonanie zapytania. Wszystkie przykłady, które mogę znaleźć w dokumentacji i gdziekolwiek indziej, nie działają na Column lub są dla ScalaQuery i nie działają już.

Co mogę zrobić, aby to wykonać?

Odpowiedz

2

Zastosowanie:

val query = for(row <- Table) yield row 
println(Query(query.count).first) 

count jest równoważne "SELECT COUNT (*) Z tabeli". Aby uzyskać pierwszy i jedyny wiersz, należy użyć numeru first, aby uzyskać liczbę.

+2

Krótka notka: 'count' jest przestarzałe na rzecz' length'. – notan3xit

+0

ok, czy to działa? – thikonom

+2

Czy masz pojęcie, co zrobić z wartościami typu 'scala.slick.lifted.Column', które są zwracane przez metody takie jak' length'? Twoje rozwiązanie działa, ale generuje dość długą instrukcję z trzema "SELECT". Wydaje się to strasznie dużo dla prostej liczby bez żadnych dalszych wymagań: 'wybierz x2.x3 z (wybierz liczbę (1) jako x3 z (wybierz x4." Id ", x4." Wartość "ze 'tabeli' x4) x5) x2' – notan3xit

4

Każde z nich powinno załatwić sprawę:

Query(MyTable).list.length 

lub

(for{mt <- MyTable} yield mt).list.length 

lub

(for{mt <- MyTable} yield mt.count).first 

Aktualizacja:

Pri nting dziennika bazy danych H2 pokazuje to na ostatniej kwerendy, która wygląda optymalna:

03:31:26.560 [main] DEBUG h2database - jdbc[2] 
/**/PreparedStatement prep10 = conn1.prepareStatement("select select count(1) from \"MYTABLE\" s5", 1003, 1007); 
+5

To stworzy listę z kompletnym zestawem wyników przed zliczaniem. Oczywiście działa, ale w przypadku bardzo dużych tabel jest niepraktyczny, ponieważ długość będzie obliczana w O (n) złożoności czasu i przestrzeni. – notan3xit

+0

Dodałem jeszcze jeden, ale to może wygenerować tę samą instrukcję select, co w odpowiedzi thikonom. Chociaż jest nieco inny – Jack

+0

Dla twojej trzeciej wersji dostaję 'MySQLSyntaxErrorException'. – notan3xit

4

Mimo, że nie był w stanie sprawdzić wynikowy SQL, można uzyskać krótszy źródła przez upuszczenie .list:

Query(MyTable.length).first 
+0

To wygląda na najczystsze rozwiązanie dla mnie, ale nadal wydaje się generować SQL, który zlicza wszystkie pola w 'MyTable' i nie jest tak skuteczne, jak' SELECT COUNT (*) FROM "MyTable"; ' – dbau

+0

Strona wydania: https : //github.com/slick/slick/issues/175 Zostaw komentarz tam. – Tvaroh