Java JOOQ通过外键表获取

Java JOOQ通过外键表获取,java,sql,jooq,Java,Sql,Jooq,我有三张桌子: Users Keys UserKeys UserKeys表既有来自用户的主键,也有用于建立用户和键之间关系的键表 如何获取具有所有相关密钥的用户 如果存在其他表(例如UserRoles等),该怎么办?通常,如何通过外键表获取用户和所有相关行?使用标准SQL JOIN 我猜你用的是jOOQ的。编写联接就像在SQL中编写联接一样: ctx.select//(可选)在此处显式列出列 .来自用户 .joinUSER\u KEYS.onUSERS.ID.equaler\u KEYS.US

我有三张桌子:

Users
Keys
UserKeys
UserKeys表既有来自用户的主键,也有用于建立用户和键之间关系的键表

如何获取具有所有相关密钥的用户

如果存在其他表(例如UserRoles等),该怎么办?通常,如何通过外键表获取用户和所有相关行?

使用标准SQL JOIN 我猜你用的是jOOQ的。编写联接就像在SQL中编写联接一样:

ctx.select//(可选)在此处显式列出列 .来自用户 .joinUSER\u KEYS.onUSERS.ID.equaler\u KEYS.USER\u ID .joinKEYS.onUSER_KEY.KEY_ID.eqKEYS.ID .whereUSERS.NAME.eqsomething 取来 嵌套集合 如果存在其他表(例如UserRoles等),该怎么办?一般来说,如何获取用户和通过外键表关联的所有相关行

我不确定这是否还是同一个问题。上面的内容可能是关于如何进行连接的,这篇文章似乎更具体地介绍了如何获取嵌套集合

因为一旦连接多个对多个路径,连接总是会产生笛卡尔积,这是不可取的。从即将发布的JOOQ3.14开始,如果您的数据库支持,您可以使用SQL/XML或SQL/JSON作为解决方案。例如:

列出学生名单= ctx.selectjsonObject jsonEntryid,USERS.ID, jsonEntryname,USERS.NAME, jsonEntrykeys,现场 选择JSONARRAYAGJSONOBJECTKEYS.NAME、KEYS.ID .Fromkey .joinUSER\u KEYS.onKEYS.ID.equaler\u KEYS.KEY\u ID .whereUSER\u KEYS.USER\u ID.equaler.ID , jsonEntryroles,现场 选择jsonarrayagjsonobjectroles.NAME、ROLES.ID .来自角色 .joinUSER\u ROLES.onROLES.ID.equaler\u ROLES.ROLE\u ID .whereUSER\u ROLES.USER\u ID.equaler.ID .来自用户 .whereUSERS.NAME.eqsomething .fetchIntoUser.class; 假设用户类如下所示,并且在类路径上有Gson或Jackson可以从JSON映射到Java数据结构:

类密钥{ 长id; 字符串名; } 阶级角色{ 长id; 字符串名; } 类用户{ 长id; 字符串名; 列出键; 列出角色; } 当然,您不必映射到Java数据结构并直接生成JSON结果,而无需进一步映射

请注意,JSON_ArrayAg将空集聚合为NULL,而不是空[]

使用多个查询
如果您不能使用上述方法,因为您还不能使用jOOQ 3.14,或者因为您的RDBMS不支持SQL/XML或SQL/JSON,那么您可以运行多个查询,并在您的终端手动组装结果。

在jOOQ或SQL中?@jarlh jOOQ是我需要的