7

我有一些看起来像这样的代码:

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

目前我正在执行以下操作来获取计数:

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

但似乎必须有一个更好的解决方案(这是类型安全的......因为这是使用 jooq 的全部意义)。有什么建议么?

4

1 回答 1

7

不幸的是,对于这个特定的查询,没有很多“更好”的方法来类型安全地获取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()方法中,完全是 C# 的 LINQ 或 Scala 的 SLICK 的方式。SELECT这将使更高级语句的表达变得非常复杂。此处记录了更详细的解释

在 jOOQ 3.0 中,引入了额外的记录级类型安全。在 jOOQ 3.3 中,因此可以获取单个值(已注册为#2246):

<T> T fetchValue(Select<Record1<T>> select);
于 2013-02-19T09:03:33.683 回答