2013-02-12 19 views
8

Sto cercando di creare una query con Slick 1.0.0 che restituisce il conteggio equivalente al seguente istruzione SQL consecutive:righe contare con Slick 1.0.0

SELECT COUNT(*) FROM table; 

Quello che ho finora è:

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

Questa stampa [email protected]. Inoltre, query.length sembra essere di tipo scala.slick.lifted.Column. Non riesco a trovare un modo per eseguire la query. Tutti gli esempi che posso trovare nella documentazione e altrove non funzionano su Column o sono per ScalaQuery e non funzionano più.

Cosa posso fare per eseguire questo?

risposta

2

Usa:

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

Il count è equivalente a "SELECT COUNT (*) FROM Tabella". Per ottenere la prima e l'unica riga devi usare first per ottenere il conteggio.

+2

Solo una breve nota: 'count' è deprecato a favore di' length'. – notan3xit

+0

ok, funziona per te? – thikonom

+2

Non hai idea di cosa fare con i valori di tipo 'scala.slick.lifted.Column' che vengono restituiti con metodi come' length'? La tua soluzione funziona, ma genera una dichiarazione piuttosto lunga con tre 'SELECT's. Questo sembra un bel po 'per un semplice conteggio senza ulteriori requisiti: 'selezionare x2.x3 da (selezionare count (1) come x3 da (selezionare x4.'id', x4.'valore 'da' table 'x4) x5) x2' – notan3xit

4

Qualsiasi di questi dovrebbe fare il trucco:

Query(MyTable).list.length 

o

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

o

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

Aggiornamento:

Pri nting il registro del database H2 mostra questo per l'ultima query, che appare ottimale:

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

Bene, questo creerebbe un elenco con il set di risultati completo prima del conteggio. Ovviamente funziona, ma per tabelle molto grandi non è pratico, dal momento che la lunghezza sarà calcolata nella complessità O (n) del tempo e dello spazio. – notan3xit

+0

Ne ho aggiunto uno in più, ma questo potrebbe generare la stessa istruzione di selezione di quella nella risposta di thikonom. Sebbene sia leggermente diverso – Jack

+0

Per la terza versione ottengo un 'MySQLSyntaxErrorException'. – notan3xit

4

Anche se non ero in grado di controllare l'SQL risultante, si potrebbe ottenere fonte più breve facendo cadere .list:

Query(MyTable.length).first 
+0

Questa mi sembra la soluzione più pulita, ma sembra ancora generare SQL che conta tutti i campi in 'MyTable' e non è altrettanto efficiente di' SELECT COUNT (*) FROM "MyTable"; ' – dbau

+0

Pagina problema: https : //github.com/slick/slick/issues/175 Lascia un commento lì. – Tvaroh

Problemi correlati