2013-02-19 6 views
6

Ich habe einige Code, der wie folgt aussieht:Abrufen der Wert von selectCount in jOOQ

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

Derzeit ist das folgende Ich mache die Zählung zu erhalten:

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

Aber es scheint, wie es muss eine bessere Lösung sein (das ist typsicher ... da ist ja der ganze Sinn von jooq). Irgendwelche Vorschläge?

Antwort

6

Leider gibt es für diese spezielle Abfrage nicht viele "bessere" Möglichkeiten, den Wert count() typsicher zu bekommen. Was Sie tun können, Typsicherheit hinzuzufügen, ist dies:

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

Das Problem, das um den Vorsprung der größte Teil der Typinformation ist „verloren“ zu dem Java-Compiler, durch die Zeit, die fetch() Methoden sind "erreicht". Es gibt keine Möglichkeit, dass eine ResultQuery.fetchXXX() Methode es aus der Klausel SELECT wiederherstellen und es für Sie produzieren kann.

In der jOOQ Benutzergruppe haben einige Benutzer argumentiert, die Projektion in die fetch() Methoden zu verschieben, ganz so, wie C# 's LINQ oder Scala's SLICK es tun. Dies würde den Ausdruck von weiter fortgeschrittenen SELECT Aussagen erheblich komplizieren. Ein more elaborate explanation is documented here.

Mit jOOQ 3.0 wurde eine zusätzliche Typensicherheit auf Datensatzebene eingeführt. In jOOQ 3.3 wird es somit möglich sein, einen einzelnen Wert als solchen zu holen (wurde als #2246 registriert):

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