Java 如何在jOOQ中编写计数查询

Java 如何在jOOQ中编写计数查询,java,sql,jooq,Java,Sql,Jooq,我正在将纯SQL转换为jOOQ,现在我有了这个 ("SELECT Count(*) Count From Table "); 我必须用jOOQ写这个我们怎么写 selectQueryRecord.addSelect(Here Count Function ); selectQueryRecord.addFrom(Table); 这是我们必须这样使用的解决方案 selectQueryRecord.fetchCount(); 注: 不赞成。-3.5.0-[3356]-此方法正在按原样移除

我正在将纯SQL转换为jOOQ,现在我有了这个

("SELECT Count(*) Count From Table "); 
我必须用jOOQ写这个我们怎么写

selectQueryRecord.addSelect(Here Count Function );
selectQueryRecord.addFrom(Table);

这是我们必须这样使用的解决方案

  selectQueryRecord.fetchCount();
注: 不赞成。-3.5.0-[3356]-此方法正在按原样移除 与所有其他类型的ResultQuery.fetch截然不同 方法,因为它通过包装修改原始Select语句 信息技术特别是,这种方法很容易与 ResultQuery.fetchField,或者更具体地说是fetchcount,其中 完全不同的语义。使用DSLContext.fetchCountSelect 相反在其附加执行器的上下文中执行此查询 并返回一个COUNT*值

我认为正确的写计数的方法如下:

 SelectQuery<Record> selectQueryCount = transaction.selectQuery();
 selectQueryCount.addFrom(Table);
 
 Result<Record> resultObject = selectQueryRecord.fetchCount();

实现您的请求最直接的方法是:

整数计数= DSL.usingconfiguration .选择计数 .表格 .fetchOne0,int.class; 或者,您可以显式表示函数:

整数计数= DSL.usingconfiguration 。选择dsl.count .表格 .fetchOne0,int.class; 还有另一种方法可以获取任意select表达式的索引,这有助于避免在上述fetchOne方法中指定结果列索引和类型。它使用:

整数计数= DSL.usingconfiguration .fetchCountDSL.selectFromTable; 不过,请注意,这样会呈现嵌套的select,如下所示:

 SelectQuery<Record> selectQueryCount = transaction.selectQuery();
 selectQueryCount.addFrom(Table);
 
 Result<Record> resultObject = selectQueryRecord.fetchCount();
从选择a、b、…中选择计数*。。。从桌子上
对此,我使用以下语法:

导入org.jooq.impl.DSL.count ... 整数计数= DSL.usingconfiguration .选择计数 .表格 .fetchOnecount; 这不那么冗长,也更简单

Lukas的答案是2013年的,也许当时不存在这种解决方案。

我用了这个:


整数计数=DSL.selectCount.fromTable.whereTable.FIELD.eqvalue.fetchoneintoiger.class

我可以使用我在代码中使用的同一个事务变量吗?我不确定这两者之间的关系。从您的其他问题来看,我怀疑这与jOOQ DSL上下文类型有关。但请提出新的堆栈溢出问题和/或写信给,询问与事务相关的问题handling@LukasEder当前位置坐在这里喝完一杯葡萄酒,我身上的API设计师部分回答说:1它可能应该一直很长,即使JDBC使用了int,如果long更合适并且容纳int,那么也没有必要匹配JDBC,2我希望我们最终可以更改它,即使这现在不会对我产生任何影响——也许有一天它可能会不管怎么说,我只是好奇,谢谢你的回答——还有这个伟大的图书馆。@GarretWilson:可能是你说的酒。。。但你是对的:是的,有几个愚蠢的设计决定。然而,它们就在那里,我们正在进行语义版本控制,所以我们不能很快摆脱它们。但我意识到,我们还没有解决这个特殊情况的问题,所以这里是为jOOQ 4.0计划的:@Q10Viking当将列值映射到int.class时,jOOQ不会抛出NPE,而是使用int类型的默认值,即0。因此,如果没有结果,fetchOne可能会返回null,如果没有结果,fetchOne0可能会返回null,或者位置0处的值为null,但在这些情况下,fetchOne0、int.class将返回0..fetchCount现在不推荐使用@Lukas Elder的答案现在是正确的。不是这个。从JooQ 3.5.0开始就不推荐了