在jOOQ中交错/分阶段/条件SQL构建

时间:2016-02-25 14:22:11

标签: java sql jdbc jooq

有没有办法使用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开始,因为目标表在运行时更改。

要求是最终查询在运行时根据输入的值而更改。

1 个答案:

答案 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