Получение значения selectCount в jooq

У меня есть код, который выглядит так:

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

В настоящее время я делаю следующее, чтобы получить счет:

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

Но похоже, что должно быть лучшее решение (это безопасно для типов... так как в этом весь смысл использования jooq). Какие-либо предложения?


person jorlow    schedule 19.02.2013    source источник


Ответы (1)


К сожалению, для этого конкретного запроса не так много «лучших» способов безошибочного получения значения count(). Что вы могли бы сделать, чтобы добавить безопасность типов, так это:

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

Проблема в том, что большая часть информации о типе проекции была "потеряна" для компилятора Java к моменту "достижения" методов fetch(). Метод ResultQuery.fetchXXX() никак не может восстановить его из предложения SELECT и предоставить его вам.

В группе пользователей jOOQ некоторые пользователи выступают за то, чтобы полностью перенести проекцию в методы fetch(), как это делают LINQ в C# или SLICK в Scala. Это значительно усложнило бы выражение более сложных операторов SELECT. более подробное объяснение задокументировано здесь.

В jOOQ 3.0 была введена дополнительная безопасность типов на уровне записей. Таким образом, в jOOQ 3.3 можно будет получить одно значение как таковое (было зарегистрировано как #2246). ):

<T> T fetchValue(Select<Record1<T>> select);
person Lukas Eder    schedule 19.02.2013