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



可以从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?如果这是不可能的,任何人都知道一个查询生成器库允许这将是受欢迎的。

目前无法通过公共API完成。在未来的jOOQ 4.0中,可能会将DSL API和模型API更清晰地分离,这样的模型API将允许您自由地操作所有查询部分,包括再次从SELECT子句中删除对象。

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

  1. 在确定是否需要之前,不要添加ORDER BY子句:

    SelectQuery<?> select = create
        .select()
        .from("myTable")
        .where("fk = 1")
        .getQuery();
    if (someCondition)
        select.addOrderBy(DSL.field("pk"));
    

    备选逻辑:

    List<SortField<?>> orderBy = new ArrayList<>();
    if (someCondition)
        orderBy.add(DSL.field("pk").asc());
    create.select()
          .from("myTable")
          .where("fk = 1")
          .orderBy(orderBy);
    
  2. 使用ExecuteListenerVisitListener对查询进行后处理/转换。不过,这更像是在边缘情况下的一种变通方法。

在您的特殊情况下,您可能应该选择选项1。另一种处理动态SQL生成的更实用的方法记录在这里。

最新更新