有没有办法使用jOOQ在阶段/阶段构建SQL?类似的东西:
DSLContext create = DSL.using(conn, SQLDialect.MYSQL);
DSL dsl = create.from(table("links"));
if( !StringUtils.isEmpty(place) ) { // place is specified, change the query
long placeId = getPlaceId();
if (placeId > 0) {
dsl = create.from(table("place_links"))
.join(table("links"))
.on(field("links.id").equal(field("place_links.link_id")))
.where(field("place_links.place_id").equal(placeId));
}
}
String sql = dsl.select(field("*"))
.orderBy("links.score")
.limit(1)
.getSQL();
以上不会编译,但我正在寻找类似原则的东西。我需要从from
开始,因为目标表在运行时更改。
要求是最终查询在运行时根据输入的值而更改。
答案 0 :(得分:2)
如果您立即开始构建SELECT
语句,则SQL不会是一种非常可组合的语言。但是如果你认为不同的条款是动态构建块,那么事情就会变得更加简单。在你的情况下:
Table<?> from = table("links");
Condition where = trueCondition();
if (!StringUtils.isEmpty(place)) {
long placeId = getPlaceId();
if (placeId > 0) {
from = from.join("place_links").on("links.id = place_links.link_id");
where = where.and("place_links.place_id = ?", placeId);
}
}
DSL.using(conn)
.selectFrom(from)
.where(where)
.orderBy(field("links.score"))
.limit(1)
.fetch();
以上是假设这个
import static org.jooq.impl.DSL.*;
此处描述了有关如何使用jOOQ动态构建SQL语句的更多信息: http://www.jooq.org/doc/latest/manual/sql-building/dynamic-sql