有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JOOQ Select查询中的Select计数

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


共 (2) 个答案

  1. # 1 楼答案

    卢卡斯建议使用^{}是更好的解决方案,因为它保留了<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. # 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();
    

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

    关于COUNT(*) OVER ()的详细描述可以在这里找到:here