【问题标题】:JOOQ - Select count inside select queryJOOQ - 选择查询中的选择计数
【发布时间】:2017-12-18 14:14:54
【问题描述】:

将以下语句转换为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。

【问题讨论】:

    标签: java sql postgresql jooq


    【解决方案1】:

    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();
    

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

    【讨论】:

    【解决方案2】:

    这是另一个使用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

    【讨论】:

      猜你喜欢
      • 2018-01-27
      • 1970-01-01
      • 2020-11-27
      • 2016-08-24
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 2017-10-30
      • 2022-01-02
      相关资源
      最近更新 更多