1. 概述

在本教程中,我们将演示如何使用 jOOQ(Java Object Oriented Querying) 来执行 count 查询。jOOQ 是一个流行的 Java 数据库库,它可以帮助你编写类型安全的 SQL 查询。

2. 关于 jOOQ

jOOQ 可以看作是 ORM 的一种替代方案。与大多数以领域模型为中心的 ORM(如 Hibernate)不同,jOOQ 是以关系模型为中心的。它允许你使用 SQL 来定义数据库对象,并自动生成对应的 Java 代码来进行映射。

✅ 简单来说:jOOQ 更贴近原生 SQL,适合对 SQL 有掌控欲的开发者。

3. Count 查询的几种方式

假设我们有一个 author 表,包含字段:idfirst_namelast_name

执行 count 查询可以通过以下几种方式实现。

3.1. 使用 fetchCount

DSL.fetchCount 提供了多种方式来统计表中的记录数。

✅ 基础用法:统计全表记录数

int count = dsl.fetchCount(DSL.selectFrom(AUTHOR));
Assert.assertEquals(3, count);

✅ 带条件统计:使用 where 子句

int count = dsl.fetchCount(DSL.selectFrom(AUTHOR)
  .where(AUTHOR.FIRST_NAME.equalIgnoreCase("Bryan")));
Assert.assertEquals(1, count);

✅ 使用 fetchCount(Table, Condition) 方法

int count = dsl.fetchCount(AUTHOR, AUTHOR.FIRST_NAME.equalIgnoreCase("Bryan"));
Assert.assertEquals(1, count);

✅ 多条件查询:使用 Collection<Condition>

Condition firstCond = AUTHOR.FIRST_NAME.equalIgnoreCase("Bryan");
Condition secondCond = AUTHOR.ID.notEqual(1);
List<Condition> conditions = new ArrayList<>();
conditions.add(firstCond);
conditions.add(secondCond);

int count = dsl.fetchCount(AUTHOR, conditions);
Assert.assertEquals(1, count);

✅ 使用 varargs 传递多个条件

Condition firstCond = AUTHOR.FIRST_NAME.equalIgnoreCase("Bryan");
Condition secondCond = AUTHOR.ID.notEqual(1);

int count = dsl.fetchCount(AUTHOR, firstCond, secondCond);
Assert.assertEquals(1, count);

✅ 使用 .and() 组合条件

int count = dsl.fetchCount(AUTHOR, 
    AUTHOR.FIRST_NAME.equalIgnoreCase("Bryan")
        .and(AUTHOR.ID.notEqual(1)));
Assert.assertEquals(1, count);

3.2. 使用 count() 函数

你也可以直接使用 DSL.count() 函数来获取记录数:

int count = dsl.select(DSL.count())
  .from(AUTHOR)
  .fetchOne(0, int.class);
Assert.assertEquals(3, count);

⚠️ 注意:这种方式返回的是一个 Record,需要用 fetchOne() 提取结果。

3.3. 使用 selectCount()

(原文中未提供示例,此处略去)

3.4. 带 groupBy 的 Count 查询

使用 groupBy 可以按字段分组统计记录数:

Result<Record2<String, Integer>> result = dsl
  .select(AUTHOR.FIRST_NAME, DSL.count())
  .from(AUTHOR)
  .groupBy(AUTHOR.FIRST_NAME)
  .fetch();

Assert.assertEquals(3, result.size());
Assert.assertEquals(result.get(0).get(0), "Bert");
Assert.assertEquals(result.get(0).get(1), 1);

4. 总结

本文介绍了在 jOOQ 中执行 count 查询的多种方式:

  • fetchCount():适用于简单或带条件的统计
  • count():配合 select 使用,灵活性更高
  • groupBy:用于分组统计

如果你对 SQL 有较高掌控需求,jOOQ 是个非常值得尝试的工具。它保留了 SQL 的表达力,同时提供了 Java 的类型安全。

📌 所有示例代码可在 GitHub 项目 中找到。


原始标题:Count Query In jOOQ