java - 使用 jooq 通过子查询删除

标签 java sql jooq

我想用jooq来处理这条SQL指令(listName是一个List):

DELETE FROM table_calendar cal
WHERE cal.client_id
IN (
SELECT client.id FROM table_client client
JOIN cal 
ON cal.client_id = client.id
WHERE client.name = :listName )

我写了这个提案:

    SelectConditionStep<Record1<String>> res = create.select(CALENDAR.CLIENT_ID)
                        .from(CALENDAR)
                        .join(CLIENT)
                        .on(CLIENT.ID.eq(CALENDAR.ID))
                        .where(CLIENT.NAME.in(listName));

    Query deleteQuery = create.delete(CALENDAR)
                    .where(CALENDAR.ID.in(res.getBindValues()));

    create.batch(deleteQuery).execute();

这是正确的方法吗?

最佳答案

您的语句中不涉及批量查询。另外,我不确定为什么您需要在子查询中加入 calendar 表。这是一个替代的 SQL 查询:

DELETE FROM calendar
WHERE client_id IN (
    SELECT client.id
    FROM client
    WHERE client.name = :listName
)

这将转换为以下 jOOQ 查询

create.delete(CALENDAR)
      .where(CALENDAR.CLIENT_ID.in(
           select(CLIENT.ID)
          .from(CLIENT)
          .where(CLIENT.NAME.eq(listName))
      ))
      .execute();

上面的 jOOQ 查询(一如既往)假设您静态导入:

import static org.jooq.impl.DSL.*;

关于java - 使用 jooq 通过子查询删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42349995/

相关文章:

java - 转换为父类并丢失信息 - 存储对象的一部分

java - JPA2 : create-or-extend-tables is not extending existing table with new column

sql - 如何联合 SELECT 两个具有两个表的 ID 的表?

java - jOOQ - 如何将列和表传递给函数?

java - 从 "lockouttime"属性中检索当前日期和时间

java - DataNucleus 中的多对一单向关系

java - 从 JOOQ 解析器结果中获取表/列元数据

java - 如何使jOOQ引用保留关键字的表名?

sql - PostgreSQL 按月和类型分组数据

sql - 查找 SQL Server 中一天前发生的死锁详细信息