【问题标题】:Create count() query from existing query从现有查询创建 count() 查询
【发布时间】:2012-05-18 19:36:40
【问题描述】:

编辑: 我使用的是 1.6.8 版的 jOOQ;在较新的版本中,这应该可以工作(见答案)

我正在为我的 java Web 应用程序编写一个网格模型,使用 Jooq 来处理通过分页、排序等获取数据...

首先,我使用factory.select(...) 创建一个选择并将其 (SelectConditionStep) 作为参数传递给我的网格模型,在此我根据参数添加所需的.limit().orderBy()

但我现在的问题是我还需要知道结果的总数(不仅仅是 1 页)来计算总页数。所以我的问题是,是否有可能以某种方式从给定的SelectConditionStep 创建计数查询。

我想把它作为一个子查询包装在一个计数查询中;类似于:

(不起作用,只是为了展示想法)

factory.select(count()).from(selectConditionStep)...

在 MySQL 中我会这样做:

select count(*) from (select ...) as r

我拥有的当前代码:

        private final SelectConditionStep selectStep;
        ...

        @Override
        public int getAvailableRows() {

            JooqSelect select = new JooqSelect() {

                @SuppressWarnings("unchecked")
                protected Result<Record> select(Connection connection) throws SQLException {

                    Factory create = new Factory(connection, dialect);              
                    create.attach(selectStep);

                    /* This does not compile, just to show what I need */               
                    return create.select(count()).from(selectConditionStep).fetch();
                }
            };

            session.doWork(select); 

            /* Get result */
            return select.getResult()...;
        }

【问题讨论】:

  • 你正在尝试做的应该工作。 SelectFromStep.from(TableLike...) 方法接受子选择(即SelectConditionStep,它扩展了TableLike。你能提供完整的例子和你得到的错误吗?
  • @LukasEder 我添加了一些代码。我对 Jooq 很陌生,但由于 Hibernate 的一些限制,我正在尝试 Jooq,因此感谢您的帮助。

标签: mysql count jooq


【解决方案1】:

您更新的示例提到count() 是未知的。这实际上是DSL.count()。您有三个选择:

  • 使用selectCount() 而不是select(count())。这是一种方便的方法
  • 完全限定DSL.count() 函数
  • 从工厂静态导入所有方法:

    import static org.jooq.impl.DSL.*;
    

引用XYZStep 类型:

附带说明一下,您永远不需要直接引用 jOOQ XYZStep 类型,它们仅用作实现内部 DSL 的辅助类型。 Here's a blog post explaining what the alternatives are.

【讨论】:

  • 谢谢。我现在注意到正在使用的 jOOQ 版本是 1.6.8。我自己无法自行更改(意味着其他应用程序也需要更新)。在这个版本中,count() 方法不是静态的,也不存在 selectCount()。这是否意味着在我的公司决定升级之前,我现在被困住了?
  • 不,当时你必须写create.count(),动态调用它。但我建议升级。从那时起(2011 年 10 月)进行了大量改进和错误修复
  • 好的,谢谢,它有效。感谢您的大力帮助 :) 肯定会与我的同事讨论升级
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多