我有一些看起来像这样的代码:
Record record = jooq
.selectCount()
.from(USERS)
.fetchOne();
Run Code Online (Sandbox Code Playgroud)
目前我正在做以下事情以获得计数:
Integer count = (Integer) record.getValue(0);
Run Code Online (Sandbox Code Playgroud)
但似乎必须有一个更好的解决方案(这是类型安全的......因为这是使用jooq的全部意义).有什么建议?
不幸的是,对于这个特定的查询,没有太多"更好"的方法来安全地获取count()值.你能做什么,增加类型安全性,是这样的:
Field<Integer> f = count();
Integer count = jooq.
.select(f) // Or selectCount(). Replaced it to illustrate the case
.from(USERS)
.fetchOne(f);
Run Code Online (Sandbox Code Playgroud)
问题是,当fetch()"到达"方法时,关于投影的大多数类型信息已经"丢失"到Java编译器.没有办法,一个ResultQuery.fetchXXX()方法可以从恢复它SELECT条款,它产生于你.
在jOOQ用户组中,一些用户认为将投影移动到fetch()方法中,完全是C#的LINQ或Scala的SLICK的方式.这会使更高级SELECT语句的表达变得更加复杂.一个更详尽的解释记录在这里.
使用jOOQ 3.0,引入了额外的记录级类型安全性.在jOOQ 3.3中,因此可以获取单个值(已注册为#2246):
<T> T fetchValue(Select<Record1<T>> select);
Run Code Online (Sandbox Code Playgroud)