Java Jooq-左内连接
我正在尝试查询我的task_template表,其中task_template.id.in(1,4)与task.task_template_id.eq(task_template.id)所在的task表上的内部联接。所以我想返回id为1或4的所有模板行,以及该模板的任务(如果存在) 我的数据库中有两个模板,其中一个任务的任务模板id为1 因此,我尝试返回两个模板,其中一个模板中的任务为null,另一个模板中的任务为填充 然而,我的查询似乎在进行内部联接,并且只返回一个结果Java Jooq-左内连接,java,mysql,jooq,Java,Mysql,Jooq,我正在尝试查询我的task_template表,其中task_template.id.in(1,4)与task.task_template_id.eq(task_template.id)所在的task表上的内部联接。所以我想返回id为1或4的所有模板行,以及该模板的任务(如果存在) 我的数据库中有两个模板,其中一个任务的任务模板id为1 因此,我尝试返回两个模板,其中一个模板中的任务为null,另一个模板中的任务为填充 然而,我的查询似乎在进行内部联接,并且只返回一个结果 var que
var query =
dsl.select(TASK_TEMPLATE.fields())
.select(TASK.fields())
.from(TASK_TEMPLATE)
.leftJoin(TASK)
.on(TASK_TEMPLATE.ID.eq(TASK.TASK_TEMPLATE_ID))
.where(TASK_TEMPLATE.TENANT.eq(TenantContext.getCurrentTenant()))
.and(TASK_TEMPLATE.ID.in(rootTemplateIds))
.and(TASK.ENTITY_NAME.eq(entityName))
.and(TASK.ENTITY_ID.eq(entityId))
.and(TASK.DELETED.eq(Boolean.FALSE))
.orderBy(TASK.ORDER.asc().nullsLast());
当您离开联接时,不能在
TASK
表上编写这样的谓词,否则,结果将是您的左联接变成内部联接。这可以通过示例来说明:
任务模板
+----+--------+
|ID |租户|
+----+--------+
|1 | A|
|2 | B|
+----+--------+
任务
+----------------+-------------+
|任务\租户\ ID \实体\名称|
+----------------+-------------+
|1 | X|
+----------------+-------------+
左联接后的结果将为
+----+--------+----------------+-------------+
| ID | TENANT | TASK_TENANT_ID | ENTITY_NAME |
+----+--------+----------------+-------------+
| 1 | A | 1 | X |
| 2 | B | | |
+----+--------+----------------+-------------+
现在,如果您正在过滤实体_NAME
(和其他字段),在左连接后,这些字段可能是NULL
,那么您将获得与最初内部连接相同的效果。不能从WHERE
子句中的LEFT JOIN
-ed表中筛选列
也许,您打算在ON
子句中过滤它们(作为LEFT JOIN
操作的一部分):
var查询=
dsl.select(TASK_TEMPLATE.fields())
.select(TASK.fields())
.from(任务模板)
.leftJoin(任务)
.on(TASK\u TEMPLATE.ID.eq(TASK.TASK\u TEMPLATE\u ID))
//把这些搬过来
.和(任务实体\名称.eq(实体名称))
和(任务实体_ID.eq(entityId))
.和(TASK.DELETED.eq(Boolean.FALSE))
.where(TASK_TEMPLATE.TENANT.eq(TenantContext.getCurrentTenant()))
.和(任务\模板ID.in(rootTemplateId))
//把它们从这里移走
//.和(任务实体\名称.eq(实体名称))
//和(任务实体_ID.eq(entityId))
//.和(TASK.DELETED.eq(Boolean.FALSE))
.orderBy(TASK.ORDER.asc().nullsLast());