2013-02-19 15 views
6

ho qualche codice che assomiglia a questo:Recuperare il valore della selectCount in jooq

Record record = jooq 
    .selectCount() 
    .from(USERS) 
    .fetchOne(); 

Attualmente sto effettuando le seguenti operazioni per ottenere il conteggio:

Integer count = (Integer) record.getValue(0); 

ma sembra che non ci deve essere una soluzione migliore (è sicuro dal punto di vista del tipo ... dal momento che questo è il punto chiave dell'utilizzo di jooq). Eventuali suggerimenti?

risposta

6

Sfortunatamente, per questa particolare query, non ci sono molti modi "migliori" per ottenere tipicamente il valore count(). Che cosa si potrebbe fare, per aggiungere il tipo di sicurezza, è questo:

Field<Integer> f = count(); 
Integer count = jooq. 
    .select(f) // Or selectCount(). Replaced it to illustrate the case 
    .from(USERS) 
    .fetchOne(f); 

Il problema è che la maggior parte delle informazioni di tipo riguardo la proiezione è stato "perso" per il compilatore Java, per il momento i metodi fetch() sono "raggiunto". Non è possibile che un metodo ResultQuery.fetchXXX() possa ripristinarlo dalla clausola SELECT e produrlo.

Sul gruppo di utenti jOOQ, alcuni utenti hanno sostenuto di spostare la proiezione nei metodi fetch(), interamente, nel modo in cui LINQ di C# o Scala SLICK lo fanno. Ciò complicherebbe notevolmente l'espressione delle affermazioni più avanzate SELECT. An more elaborate explanation is documented here.

Con jOOQ 3.0, è stata introdotta un'ulteriore sicurezza di livello record. In jOOQ 3.3, sarà quindi possibile recuperare un singolo valore come tale (è stato registrato come #2246):

<T> T fetchValue(Select<Record1<T>> select); 
Problemi correlati