求类似zvon.org的JOOQ连接查询示例及带图形化的通用查询资源
嘿,我特意整理了一套带直观文本图形的jOOQ连接查询示例,就像你想要的那种一眼就能看懂的学习形式,涵盖了最常用的连接类型,一起来看看吧!
jOOQ连接查询直观示例集
每个示例都会先展示表关联的文本结构图,再给出jOOQ的类型安全代码,最后补充实用场景说明。
1. 内连接(INNER JOIN)
表关联结构
+-------------+ +-------------+ | customers | | orders | +-------------+ +-------------+ | customer_id |<----->| customer_id | 关联字段 | name | | order_id | | email | | order_date | +-------------+ +-------------+
逻辑说明:只返回两个表中匹配关联条件的记录,相当于两个集合的交集,是日常开发中最常用的连接类型。
jOOQ代码示例
// 查询所有有订单的客户及其订单信息 Result<Record> result = dslContext.select() .from(CUSTOMERS) .join(ORDERS) // join()默认就是内连接,也可以显式写innerJoin() .on(CUSTOMERS.CUSTOMER_ID.eq(ORDERS.CUSTOMER_ID)) .fetch(); // 更精准的字段查询:只取客户姓名、订单ID和下单日期 Result<Record3<String, Integer, LocalDate>> specificResult = dslContext.select( CUSTOMERS.NAME, ORDERS.ORDER_ID, ORDERS.ORDER_DATE ) .from(CUSTOMERS) .innerJoin(ORDERS) .on(CUSTOMERS.CUSTOMER_ID.eq(ORDERS.CUSTOMER_ID)) .fetch();
2. 左外连接(LEFT OUTER JOIN)
表关联结构
+-------------+ +-------------+ | customers | | orders | +-------------+ +-------------+ | customer_id |<----->| customer_id | | name | | order_id | | email | | order_date | +-------------+ +-------------+ <--------------------- 左表全保留,右表匹配不上则为null
逻辑说明:返回左表(这里是customers)的所有记录,右表中匹配关联条件的记录会被关联;如果左表的某条记录在右表中没有匹配,右表的字段会显示为null。
jOOQ代码示例
// 查询所有客户,包括没有下过单的客户 Result<Record> allCustomersWithOrders = dslContext.select() .from(CUSTOMERS) .leftJoin(ORDERS) .on(CUSTOMERS.CUSTOMER_ID.eq(ORDERS.CUSTOMER_ID)) .fetch(); // 进阶:筛选出从未下过单的客户 Result<Record2<String, String>> noOrderCustomers = dslContext.select( CUSTOMERS.NAME, CUSTOMERS.EMAIL ) .from(CUSTOMERS) .leftJoin(ORDERS) .on(CUSTOMERS.CUSTOMER_ID.eq(ORDERS.CUSTOMER_ID)) .where(ORDERS.ORDER_ID.isNull()) .fetch();
3. 右外连接(RIGHT OUTER JOIN)
表关联结构
+-------------+ +-------------+ | customers | | orders | +-------------+ +-------------+ | customer_id |<----->| customer_id | | name | | order_id | | email | | order_date | +-------------+ +-------------+ ---------------------> 右表全保留,左表匹配不上则为null
逻辑说明:和左外连接逻辑相反,返回右表(这里是orders)的所有记录,左表匹配的记录关联,不匹配则左表字段为null。
jOOQ代码示例
// 查询所有订单,包括那些没有对应客户信息的订单(比如测试数据) Result<Record> allOrdersWithCustomers = dslContext.select() .from(CUSTOMERS) .rightJoin(ORDERS) .on(CUSTOMERS.CUSTOMER_ID.eq(ORDERS.CUSTOMER_ID)) .fetch();
4. 全外连接(FULL OUTER JOIN)
表关联结构
+-------------+ +-------------+ | customers | | orders | +-------------+ +-------------+ | customer_id |<----->| customer_id | | name | | order_id | | email | | order_date | +-------------+ +-------------+ <-------------------------------------> 两张表的所有记录都保留,不匹配字段为null
逻辑说明:返回两个表的全部记录,匹配的记录关联在一起;如果某条记录在另一个表中没有匹配,对应字段显示为null。注意:部分数据库(如MySQL)原生不支持全外连接,jOOQ会自动帮你模拟实现。
jOOQ代码示例
// 查询所有客户和所有订单,不管双方有没有关联 Result<Record> allCustomersAndOrders = dslContext.select() .from(CUSTOMERS) .fullOuterJoin(ORDERS) .on(CUSTOMERS.CUSTOMER_ID.eq(ORDERS.CUSTOMER_ID)) .fetch();
5. 交叉连接(CROSS JOIN)
表关联结构
+-------------+ +-------------+ | customers | | products | +-------------+ +-------------+ | customer_id | | product_id | | name | | product_name| +-------------+ +-------------+ 所有客户 × 所有产品 = 笛卡尔积(每条客户记录都和每条产品记录组合)
逻辑说明:返回两个表的笛卡尔积,也就是左表的每条记录都和右表的每条记录进行组合。一般用于生成测试数据、批量生成关联关系等场景。
jOOQ代码示例
// 生成所有客户和所有产品的组合(比如用于模拟"所有客户都浏览过所有产品"的测试数据) Result<Record> customerProductCombination = dslContext.select() .from(CUSTOMERS) .crossJoin(PRODUCTS) .fetch();
内容的提问来源于stack exchange,提问作者Odata Dev
相关产品推荐
相关产品推荐

