在JOOQ中建立动态表联接

时间:2019-04-11 17:50:08

标签: java sql jooq

我正在使用JOOQ作为SQL构建器工具,然后在jdbcTemplate中执行。我需要动态地将表联接添加到from子句中。此刻我正在这样做。.

textarea

然后我将select子句与where子句结合在一起。

<div class="form-group">
    <label for="textarea">Doenças:</label>
    <textarea class="form-control" rows="2" id="doencas" name="doencas"><?php echo $cl_doencas; ?></textarea>
</div>

这行得通,但是现在我要介绍分页,因此我需要换出选定的字段以进行简单的计数,如果可以在此计数查询中重用from子句,那会很好,但是我不能,因为select和from子句位于同一变量中。

更新.. 为什么我不能像这样动态地构建from子句...

SelectJoinStep<?> selectClause = select(field("ColumnA"), field("ColumnB"))
.from(table("TableA"));

if(condition) {
  selectClause.join(table("TableB), JoinType.JOIN).on(field("columnA").eq(field("columnB")));
}

如果条件为真,则表联接不会出现在生成的SQL中吗?

1 个答案:

答案 0 :(得分:2)

将jOOQ用于动态SQL的最佳方法是a more functional approach。在某些情况下,请勿以“交换”查询的方式来考虑。考虑一下查询的哪些部分是由谁通过函数提供的?例如:

ResultQuery<?> query(
    Supplier<Collection<SelectField<?>>> select,
    boolean condition,
    boolean paginate
) {
    Condition whereClause = ...;
    Table<?> from = table("TableA");
    if (condition)
        from = from.join(table("TableB")).on(field("ColumnA").eq(field("ColumnB")));

    return select(select.get())
          .from(from)
          .where(whereClause)
          .limit(paginate ? 10 : Integer.MAX_VALUE); // Could be done differently
}

现在调用上面的

query(() -> Arrays.asList(field("ColumnA"), field("ColumnB")), true, true);
query(() -> Arrays.asList(count()), true, false);

当然,另一种选择是使用窗口函数来计算该计数值,而不是运行两个查询:

count().over()