[英]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:
在知道是否需要之前,請不要添加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);
使用ExecuteListener
或VisitListener
對查詢進行后處理/轉換。 不過,這在邊緣情況下更像是一種解決方法。
在您的特定情況下,您應該使用選項1. 此處記錄了另一種更具功能性的方法來處理動態SQL生成 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.