Как написать LEFT OUTER JOIN на той же таблице в JOOQ? - PullRequest
11 голосов
/ 20 ноября 2011

как написать следующий SQL, используя jOOQ?

SELECT *
FROM food_db_schema.tblCategory AS t1
LEFT OUTER JOIN food_db_schema.tblCategory AS t2 ON t1.category_id = t2.parent_id
WHERE t2.parent_id IS NULL
AND t1.heartbeat = "ALIVE";

база данных mySQL

Ответы [ 2 ]

7 голосов
/ 20 ноября 2011

ответ flesk хорошо показывает, как это можно сделать с помощью jOOQ 1.x. Самостоятельное объединение с использованием псевдонимов более или менее эквивалентно обычному объединению с использованием псевдонимов, как описано в руководстве:

http://www.jooq.org/manual/DSL/ALIAS/

В следующей версии 2.0 псевдонимы будут сделаны менее подробными и более безопасными для типов. Следовательно, решение flesk можно упростить так:

// Type-safe table aliasing:
TblCategory t1 = TBLCATEGORY.as("t1");
TblCategory t2 = TBLCATEGORY.as("t2");

Record record = create.select()
                      .from(t1)
                       // t1 and t2 give access to aliased fields:
                      .leftOuterJoin(t2).on(t1.CATEGORY_ID.equal(t2.PARENT_ID))
                      .where(t2.PARENT_ID.isNull())
                      .and(t1.HEARTBEAT.equal("ALIVE"));

Я также описал более сложный пример самостоятельного соединения:

http://blog.jooq.org/2011/11/14/jooq-meta-a-hard-core-sql-proof-of-concept/

5 голосов
/ 20 ноября 2011

Возможно

SELECT *
FROM food_db_schema.tblCategory AS t1
WHERE t1.category_id IS NULL
AND t1.heartbeat = "ALIVE";

, но вы уверены, что t2.parent_id должен быть равен NULL и равен t1.category_id?

РЕДАКТИРОВАТЬ:

Тогда что-то вроде

Table<TblCategoryRecord> t1 = TBLCATEGORY.as("t1");
Table<TblCategoryRecord> t2 = TBLCATEGORY.as("t2");

Field<Integer> t1CategoryId = t1.getField(TblCategory.CATEGORY_ID);
Field<String> t1Heartbeat = t1.getField(TblCategory.HEARTBEAT);
Field<Integer> t2ParentId = t2.getField(TblCategory.PARENT_ID);

Record record = create.select().from(t1)
      .leftOuterJoin(t2).on(t1CategoryId.equal(t2ParentId))
      .where(t2ParentId.isNull())
      .and(t1Heartbeat.equal("ALIVE"));

в зависимости от того, как называются сгенерированные классы, свойства и объекты метамодели.

...