java中jooq,java-在JOOQ中映射相同类型的联接表

本文探讨了在SQL查询中使用表别名的重要性,特别是在多次连接同一表时。通过示例展示了如何在jOOQ中创建和使用别名,同时指出了查询可能存在的问题,即未明确处理可能不存在的评论者记录。建议使用LEFT JOIN来处理这种情况,并提供了两种不同的查询结构。此外,还提出了将第二个用户映射为Optional的建议,以处理可能缺失的数据。
摘要由CSDN通过智能技术生成

您需要为您的USERS表加上别名.在SQL中,这通常是一个好主意(无论是否使用jOOQ),如果您两次连接同一张表:

val owners = USERS.as("owners");

val reviewers = USERS.as("reviewers");

sql

.select()

.from(ITEMS.join(ITEMSOWNERS).on(ITEMSOWNERS.ITEM_ID.eq(ITEMS.ID)))

.join(owners).on(ITEMSOWNERS.OWNER_ID.eq(owners.ID))

.leftJoin(ITEMSREVIEWERS).on(ITEMSREVIEWERS.ITEM_ID.eq(ITEMS.ID))

.join(reviewers).on(ITEMSREVIEWERS.REVIEWER_ID.eq(reviewers.ID))

.where(PUBLIC_ID.eq(publicId))

.fetchGroups(WALLETS)

然后,您可以像这样显式访问两个表的列:

innerRecord.into(owners)

innerRecord.into(reviewers)

Ideally I’d like to map the second User into an Optional since it may not be around.

jOOQ中没有这种方法.显式包装如下:

Optional.of(innerRecord.into(reviewers))

关于SQL正确性的说明

我认为您的SQL查询不正确.您应该要么将您的评论者表加入联接图,要么:

.from(ITEMS.join(ITEMSOWNERS).on(ITEMSOWNERS.ITEM_ID.eq(ITEMS.ID)))

.join(owners).on(ITEMSOWNERS.OWNER_ID.eq(owners.ID))

.leftJoin(ITEMSREVIEWERS).on(ITEMSREVIEWERS.ITEM_ID.eq(ITEMS.ID))

.leftJoin(reviewers).on(ITEMSREVIEWERS.REVIEWER_ID.eq(reviewers.ID))

…或嵌套连接如下:

.from(ITEMS.join(ITEMSOWNERS).on(ITEMSOWNERS.ITEM_ID.eq(ITEMS.ID)))

.join(owners).on(ITEMSOWNERS.OWNER_ID.eq(owners.ID))

.leftJoin(ITEMSREVIEWERS

.join(reviewers).on(ITEMSREVIEWERS.REVIEWER_ID.eq(reviewers.ID))

).on(ITEMSREVIEWERS.ITEM_ID.eq(ITEMS.ID))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值