Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jooq-左内连接_Java_Mysql_Jooq - Fatal编程技术网

Java Jooq-左内连接

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

我正在尝试查询我的task_template表,其中task_template.id.in(1,4)与task.task_template_id.eq(task_template.id)所在的task表上的内部联接。所以我想返回id为1或4的所有模板行,以及该模板的任务(如果存在)

我的数据库中有两个模板,其中一个任务的任务模板id为1

因此,我尝试返回两个模板,其中一个模板中的任务为null,另一个模板中的任务为填充

然而,我的查询似乎在进行内部联接,并且只返回一个结果

    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());