java - 在 JOOQ 中映射相同类型的连接表

标签 java sql scala jooq

我有以下查询:

sql
  .select()
  .from(ITEMS.join(ITEMSOWNERS).on(ITEMSOWNERS.ITEM_ID.eq(ITEMS.ID)))
             .join(USERS).on(ITEMSOWNERS.OWNER_ID.eq(USERS.ID))
             .leftJoin(ITEMSREVIEWERS).on(ITEMSREVIEWERS.ITEM_ID.eq(ITEMS.ID))
             .join(USERS).on(ITEMSREVIEWERS.REVIEWER_ID.eq(USERS.ID))
  .where(PUBLIC_ID.eq(publicId))
  .fetchGroups(WALLETS)

考虑到有两种类型的 USERS,我想以某种元组形式取回它们。结果在这里,即我有这样的结构:

- ITEMS (given the `WHERE` clause there should be only one of those at most, though)
  - OWNERS
  - REVIEWERS

我想我知道我可以使用 fetchGroupsRecord得到到 Map<Item, Record> , 但我不太确定如何进一步处理由此产生的 Record其中应包含 User两次,即

innerRecord.into(USERS) // this should work okay, I guess
innerRecord.into(USERS) // how to make this happen on the "second" set of User columns?

理想情况下,我想映射第二个 User进入 Optional因为它可能不在身边。

最佳答案

您需要为您的 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))

关于java - 在 JOOQ 中映射相同类型的连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51540732/

相关文章:

java - 如何处理java代码中的Unchecked强制转换警告

arrays - JDK 中是否有数组的 .java 源文件?

java - Spring Data JPA - 规范加入

SQL(简单)逐行连接两个表

mysql - 返回具有相同值的最大行数的值

scala - Hadoop与Spark不匹配的问题?

java - WSDL2CODE maven 插件

sql - MySQL:带有 LEFT JOIN 的 GROUP_CONCAT

scala - 使用 Scala : what are the libraries and tools I can use? 进行 GUI 编程

scala - 为什么 2.10 坚持指定类型参数边界(在 2.9 中工作正常)?