如何在 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)
【讨论】:
我可以在我的代码中使用相同的交易变量吗 我不确定这有什么关系。根据您的其他问题,我怀疑这与 jOOQDSLContext
类型有关。但请提出一个新的 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 中编写计数查询的主要内容,如果未能解决你的问题,请参考以下文章