如何从jOOQ查询中删除子句(order by)

时间:2014-07-13 17:54:44

标签: java sql jooq

可以从jOOQ中动态构造的查询中删除子句(在我的例子中为order by子句)。

假设在创建查询后:

DSLContext create = DSL.using(SQLDialect.POSTGRES);
SelectQuery<Record> query = create.select().from("myTable").where("fk = 1").orderBy(DSL.field("pk")).getQuery();
System.out.println(query.getSQL());
// select * from myTable where (fk = 1) order by pk asc

我想更改order by子句或将其删除以仅获取

select * from myTable where (fk = 1)

可以用jOOQ制作吗?如果不可能,并且任何人都知道允许这样做的查询构建器库也将受到欢迎。

1 个答案:

答案 0 :(得分:4)

目前无法通过公共API完成此操作。在未来的jOOQ 4.0中,可能the DSL API and the Model API的更清晰的分离,其中这样的模型API允许您自由地操纵所有查询部分,包括再次从{{1}删除对象条款。

目前,您至少有两个选项来实现动态SQL:

  1. 在您知道是否需要之前,请不要添加SELECT子句:

    ORDER BY

    另类逻辑:

    SelectQuery<?> select = create
        .select()
        .from("myTable")
        .where("fk = 1")
        .getQuery();
    
    if (someCondition)
        select.addOrderBy(DSL.field("pk"));
    
  2. 使用ExecuteListenerVisitListener对您的查询进行后处理/转换。不过,这在边缘情况下更像是一种解决方法。

  3. 在您的特定情况下,您应该使用选项1. Another, more functional approach to tackling dynamic SQL generation is documented here