首页 > 解决方案 > Jooq:选择计数组

问题描述

我正在尝试计算表中 gp_status 字段的不同可能性。我有一个有效的 sql 查询,只是不知道如何将它转录到 Jooq。

select i.gp_status, COUNT(i.gp_status) 
from ideas_service.idea i 
group by i.gp_status 

到目前为止,在 JOOQ 我有这个

var result = dsl.select(IDEA.GP_STATUS,count(),count(IDEA.GP_STATUS))
                .from(IDEA)
                .groupBy(IDEA.GP_STATUS)
                .fetch();

看起来字段恢复正确,但我不知道如何提取它们。我确实知道可能的 gp_status 可能是什么。

所以我需要以某种方式获得这一行where gp_status = x

标签: javasqljooq

解决方案


如果你只需要一行

如果您只需要一行,那么您应该将该谓词添加到您的查询中,即

var result = dsl.select(IDEA.GP_STATUS, count())
                .from(IDEA)
                .where(IDEA.GP_STATUS.eq("x"))
                .groupBy(IDEA.GP_STATUS)
                .fetchOne();

此时您不再需要该GROUP BY子句:

var result = dsl.select(count())
                .from(IDEA)
                .where(IDEA.GP_STATUS.eq("x"))
                .fetchOne();

请注意,在这两种情况下,我都使用ResultQuery.fetchOne()了 ,它产生 a Record,您可以通过多种方式从中提取值,例如

// Repeat the column expression from the SELECT clause
int count1 = result.get(count());

// Access columns by index, and redundantly supply the type again
// Assuming the second query was executed
int count2 = result.get(0, int.class);

还有很多方法。

如果您需要整个结果

如果您需要整个结果集,但对于特定情况,只想提取一行,那么您可以迭代Result, which extends List,或使用Result.intoGroups(IDEA.GP_STATUS).get("x")或任何其他方法Result来做类似的事情。


推荐阅读