13

jOOQを使用して次のSQLを記述する方法は?

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です

4

2 に答える 2

9

fleskの答えは、これがjOOQ 1.xでどのように行われるかをうまく示しています。エイリアシングを使用した自己結合は、マニュアルで説明されているように、エイリアシングを使用した通常の結合とほぼ同等です。

https://www.jooq.org/doc/latest/manual/sql-building/table-expressions/aliased-tables/

次期バージョン 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/jooq-meta-a-hard-core-sql-proof-of-concept/

于 2011-11-20T13:46:37.400 に答える
6

多分

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

生成されたクラス、プロパティ、およびメタモデル オブジェクトの名前によって異なります。

于 2011-11-19T21:43:57.387 に答える