我正在使用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中吗?
答案 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()