如何在 jOOQ 中编写计数查询

Posted

技术标签:

【中文标题】如何在 jOOQ 中编写计数查询【英文标题】:How to write Count Query In jOOQ 【发布时间】:2013-11-08 12:51:02 【问题描述】:

现在我正在将 Pure SQL 转换为 jOOQ

("SELECT Count(*) Count From Table "); 

我必须在jOOQ中写这个我们怎么写?

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

【问题讨论】:

【参考方案1】:

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

  selectQueryRecord.fetchCount();

【讨论】:

自 JooQ 3.5.0 起已弃用【参考方案2】:

注意:

已弃用。 - 3.5.0 - [#3356] - 此方法正在被删除 与所有其他类型的 ResultQuery.fetch() 令人困惑地不同 方法,因为它通过包装修改原始 Select 语句 它。特别是,这种方法很容易与 ResultQuery.fetch(Field),或者更具体的 fetch(count()),它有 完全不同的语义。使用 DSLContext.fetchCount(Select) 反而。在其附加的执行程序的上下文中执行此查询 并返回一个 COUNT(*) 值。

我认为获取计数的正确写法是这样的:

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

【讨论】:

.fetchCount() 现已弃用 @Lukas Elder 的答案现在是正确的。不是这个。【参考方案3】:

使用selectCount() 实现您所要求的最直接的方法是:

int count = 
DSL.using(configuration)
   .selectCount()
   .from(Table)
   .fetchOne(0, int.class);

或者,您可以显式表达count() 函数:

int count = 
DSL.using(configuration)
   .select(DSL.count())
   .from(Table)
   .fetchOne(0, int.class);

还有另一种方法可以获取任意select 表达式的count(*),它可以帮助您避免在上述fetchOne() 方法中指定结果列索引和类型。这使用fetchCount():

int count =
DSL.using(configuration)
   .fetchCount(DSL.selectFrom(Table));

但请注意,这会呈现这样的嵌套选择:

SELECT COUNT(*) FROM (SELECT a, b, ... FROM Table)

【讨论】:

我可以在我的代码中使用相同的交易变量吗 我不确定这有什么关系。根据您的其他问题,我怀疑这与 jOOQ DSLContext 类型有关。但请提出一个新的 Stack Overflow 问题(和/或写信至jOOQ User Group)以了解与事务处理相关的问题 @LukasEder:坐在这里喝完一杯酒,我的API设计师回应:1)它可能应该一直是long,即使JDBC使用了一个int(没有必要如果 long 更合适并容纳一个 int),则“匹配”JDBC,以及 2)我希望“我们”最终可以改变它,即使这对我现在没有任何影响——也许有一天它可能! :) 无论如何,我只是好奇并感谢您的回答——以及伟大的图书馆。 @GarretWilson:可能是酒在说你……但你是对的 :) 是的,有几个愚蠢的设计决定。然而,它们就在那里,我们正在进行语义版本控制,所以我们不能很快摆脱它们。但我意识到我们还没有解决这个特殊情况的问题,所以这里是 jOOQ 4.0 计划的:github.com/jOOQ/jOOQ/issues/3714 @Q10Viking 将列值映射到int.class 时,jOOQ 永远不会抛出 NPE,而是使用int 类型的默认值,即0。所以,虽然fetchOne() 可能返回null(如果没有结果),而fetchOne(0) 可能返回null(如果没有结果,或者0 位置的值是null),@在这些情况下,987654349@ 将返回 0【参考方案4】:

我为此使用以下语法:

import org.jooq.impl.DSL.count

... 

int count = 
DSL.using(configuration)
   .selectCount()
   .from(Table)
   .fetchOne(count());

这不那么冗长和简单。

Lukas 的回答是从 2013 年开始的,也许当时这个解决方案并不存在。

【讨论】:

【参考方案5】:

我用过这个:

Integer count = DSL.selectCount().from(Table).where(Table.FIELD.eq(value)).fetchOneInto(Integer.class);

【讨论】:

以上是关于如何在 jOOQ 中编写计数查询的主要内容,如果未能解决你的问题,请参考以下文章

JOOQ - 在选择查询中选择计数

如何使用 jOOQ 执行特定查询

如何在jooq查询的左连接中检查记录是不是完​​全为空

JOOQ 删除并加入

如何在使用 jooq 创建查询字符串时转义单引号?

如何在 jOOQ 中组合条件