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

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

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

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

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

【问题讨论】:

    标签: java sql jooq


    【解决方案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);

      【讨论】:

        猜你喜欢
        • 2019-08-20
        • 2020-03-25
        • 2015-11-15
        • 2016-10-05
        • 2013-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-17
        相关资源
        最近更新 更多