Исправьте класс JOOQ для использования с DSLConext для создания и повторения результата

1

Я новичок в JOOQ.

У меня возникли проблемы с поиском в документации по учебнику или документации, какой из нескольких классов использовать при использовании оператора выбора DSLContext.

Синтаксис выбора не прав, потому что, я считаю, предложение where содержит ссылку на таблицу ifd, которая не находится внутри, а не в соединении. Я не уверен, как выполнить правильный синтаксис.

Любые источники документов были бы восприимчивы, а также указатели на то, что я делаю неправильно.

Descriptor d = DESCRIPTOR.as("d");
Desclink dl = DESCLINK.as("dl");
Ifdesc ifd = IFDESC.as("ifd");
//
Result<Record2<Integer, Integer>> result = 
      dslContext.select(d.NETWORKID, dl.PARENT)
            .from(d)
            .join(dl).on(dl.PARENT.equal(d.DESCID))
            .where(ifd.DESCID.equal(dl.CHILD))
            .fetch()
      ;
for (Record2 r2 : result) {
    Integer n = r2.getValue( d.NETWORKID);
    Integer p = r2.getValue(dl.PARENT);
    logger.println("nwid : " + n + " p " + p );
}
Теги:
jooq

2 ответа

0
Лучший ответ

Я думаю, что все, что вам не хватает, это просто еще одно соединение:

dslContext.select(ifd.IPADDRESS, d.NETWORKID, dl.PARENT)
          .from(d)
          .join(dl).on(dl.PARENT.equal(d.DESCID))
          .join(ifd).on(dl.CHILD.equal(ifd.DESCID)) // another join here
          .fetch();

Обратите внимание: вы можете объединить столько таблиц, сколько хотите, чтобы создать собственное "табличное выражение" для размещения предложения FROM в SQL. Если вы присоединитесь к трем таблицам:

A join B on ... 
  join C on ...

То, что вы действительно делаете, это (псевдо-SQL):

T  := A' join C on ...
A' := A  join B on ...

Итак, лучший способ прочитать вышеприведенное "тройное соединение":

SELECT ...
FROM ((A join B on ...) join C on ...)

API jOOQ также поддерживает вложение таких выражений JOIN изначально при использовании Table.join(). Например:

          ( A.join(B).on(...) ).join(C).on(...)
// A' --> ^^^^^^^^^^^^^^^^^^^^^
// T  --> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Метод SelectJoinStep.join() который вы используете, является простым удобством для приведенного выше Table.join()

Это может быть интересно прочитать для вас, объясняя 1-2 синтаксические вещи в SQL.

0

Я смог обойти вышеуказанный код без использования явных команд соединения.

Код ниже добавляет еще одно возвращаемое значение, String.

Result<Record3<String, Integer, Integer>> result      =    
    dslContext.select(ifd.IPADDRESS, d.NETWORKID, dl.PARENT)
            .from(d, dl, ifd)
            .where( 
                 (ifd.DESCID.equal(dl.CHILD))
                .and(dl.PARENT.equal(d.DESCID))
                .and(ifd.IFWASPINGED.isTrue()  ) 
             )
            .fetch()
            ;
for (Record3 r2 : result) {
    Integer n = r2.getValue( d.NETWORKID);
    Integer p = r2.getValue(dl.PARENT);
    String ip = r2.getValue(ifd.IPADDRESS);
    logger.println("nwid : " + n + " p " + p + "  " + ip  );
}

Меня все равно интересовало бы, как это будет выглядеть с помощью JOIN.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню