Обновите несколько таблиц с помощью JOOQ

проблема здесь с jooq заключается в том, что он не поддерживает join и updates, более того, обновляет несколько таблиц.

Я нахожу способ преобразовать этот запрос:

   String query =   "UPDATE knowCRM.customer_did cd ";
        query +=    " LEFT JOIN knowCRM.know_service ks";
        query +=    " ON ks.id = cd.customer_service_id";
        query +=    " LEFT JOIN knowCRM.customer_flags cf";
        query +=    " ON ks.service_owner_id = cf.account_number";
        query +=    " SET cd.is_cli_number= 1, cf.is_cli_number = '0'";
        query +=    " WHERE ks.service_owner_id = " + accountNumber;
        query +=    " AND cd.did_number= " + cliNumber;

в эти два:

        int count2 = wrapper.getCreate().update(CUSTOMER_DID)
                        .set(CUSTOMER_DID.IS_CLI_NUMBER, Byte.parseByte("1"))
                        .where(CUSTOMER_DID.CUSTOMER_SERVICE_ID.equal(
                                    wrapper.getCreate().select(KNOW_SERVICE.ID)
                                    .from(CUSTOMER_FLAGS, KNOW_SERVICE)
                                    .where(KNOW_SERVICE.ID.equal(CUSTOMER_DID.CUSTOMER_SERVICE_ID))
                                    .and(KNOW_SERVICE.SERVICE_OWNER_ID.equal(CUSTOMER_FLAGS.ACCOUNT_NUMBER))
                                    .and(KNOW_SERVICE.SERVICE_OWNER_ID.equal(accountNumber))
                                    .and(CUSTOMER_DID.DID_NUMBER.equal(cliNumber))
                                ))
                        .execute();

и

        int count3 = wrapper.getCreate().update(CUSTOMER_FLAGS)
                .set(CUSTOMER_FLAGS.IS_CLI_NUMBER, Byte.parseByte("0"))
                .where(CUSTOMER_FLAGS.ACCOUNT_NUMBER.equal(
                            wrapper.getCreate().select(KNOW_SERVICE.SERVICE_OWNER_ID)
                            .from(CUSTOMER_DID, KNOW_SERVICE)
                            .where(KNOW_SERVICE.ID.equal(CUSTOMER_DID.CUSTOMER_SERVICE_ID))
                            .and(KNOW_SERVICE.SERVICE_OWNER_ID.equal(CUSTOMER_FLAGS.ACCOUNT_NUMBER))
                            .and(KNOW_SERVICE.SERVICE_OWNER_ID.equal(accountNumber))
                            .and(CUSTOMER_DID.DID_NUMBER.equal(cliNumber))
                        ))
                .execute();

Мне нужен более умный способ рефакторинга этого запроса с помощью jooq без необходимости разбивать его на два массивных запроса.


person william.eyidi    schedule 21.10.2015    source источник


Ответы (1)


В принципе, JOIN операции указаны в org.jooq.Table. Ожидается запрос функции на добавление «удобных методов присоединения» также в UPDATE, так же как они существуют и в SELECT: #3266

Ваш исходный запрос может быть записан в jOOQ следующим образом:

CustomerDid cd = CUSTOMER_DID.as("cd");
KnowService ks = KNOW_SERVICE.as("ks");
CustomerFlags cf = CUSTOMER_FLAGS.as("cf");

ctx.update(cd.leftJoin(kd)
             .on(ks.ID.eq(cd.CUSTOMER_SERVICE_ID))
             .leftJoin(cf)
             .on(ks.SERVICE_OWNER_ID.eq(cf.ACCOUNT_NUMBER)))
   .set(cd.IS_CLI_NUMBER, 1)
   .set(cf.IS_CLI_NUMBER, "0")
   .where(ks.SERVICE_OWNER_ID.eq(accountNumber))
   .and(cd.DID_NUMBER.eq(cliNumber))
   .execute();
person Lukas Eder    schedule 21.10.2015
comment
в случае несоответствия типов соединяемых полей используйте .cast() - person Daneel Yaitskov; 15.09.2016
comment
@PedroBorges: этот вопрос о MySQL - person Lukas Eder; 17.03.2020