簡體   English   中英

如何從jOOQ查詢中刪除子句(order by)

[英]How a clause (order by) can be removed from a jOOQ query

可以從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和Model 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生成

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM