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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JOOQ - 在选择查询中选择计数相关的知识,希望对你有一定的参考价值。

将以下语句转换为jooq API时出现问题:

SELECT t1.col1, t1.col2, t1.col3, (SELECT count(*) FROM table2 where table2.col2 = t1.col1)
FROM table1 t1

我尝试使用DSL.count()DSL.selectCount(),但是我在搜索将where子句添加到count子查询时失败了。

该数据库是PostgreSQL 9.6。

答案

Lukas建议使用DSL.field是更好的解决方案,因为它保留了<T>类型。

更多类型安全版本:

TableField<Table1Record, Long> col1 = TABLE1.COL1;
Field<Integer> count = DSL.field(DSL.selectCount().from(TABLE2).where(TABLE2.COL2.eq(col1)));
using(configuration).select(col1, count).from(TABLE1).fetch();

我的第一个(类型较少)解决方案:

TableField<Table1Record, Long> col1 = TABLE1.COL1;
Field count = DSL.selectCount().from(TABLE2).where(TABLE2.COL2.eq(col1)).asField("count");
using(configuration).select(col1, count).from(TABLE1).fetch();

也许有一个更优雅的解决方案,但它的工作原理。生成的查询看起来像我的原始查询。

另一答案

这是使用DSL.field(...)的另一个例子:

     Field<Integer> COUNT = DSL.field("COUNT(*) OVER ()", Integer.class);

     List<Map<String, Object>> records = DSL.select(ACCESSORY.ID,
                ACCESSORY.NAME,
                ACCESSORY.TYPE,
                ACCESSORY.PRICE,
                BRAND.NAME,
                COUNT.as("total"))
            .from(ACCESSORY)
            .innerJoin(BRAND).onKey()
            .fetchMaps();

ResultSet将包含一个名为total的列,它将被视为类型java.lang.Integer。这适用于PostgreSQL 9.6。

有关COUNT(*) OVER ()的详细描述,请访问:here

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

jOOQ - 选择查询数组

Jooq java api,在选择查询中将日期时间转换为时区

使用 JOOQ 选择 NULL 作为列

jooq 从表的特定分区中选择

Jooq 与 SQL Server 如何选择前 N 个结果

用于从表中选择具有最新时间戳的行的 JOOQ 代码