[英]How to generate SQL from template with order by parameter using jOOQ?
我用 jOOQ 3.11.11 生成了這樣的 SQL 模板。
DSLContext context = new DefaultDSLContext(conf);
Query query = context.select()
.from("table1")
.where(DSL.field("report_date").eq(DSL.param("bizdate")))
.orderBy(DSL.param("sort"));
String sqlTemp = context.renderNamedParams(query);
SQL 模板:
select *
from table1
where report_date = :bizdate
order by :sort
存儲SQL模板,並根據實時查詢條件決定參數。
ResultQuery resultQuery = context.resultQuery(sqlTemp, DSL.param("bizdate", "20190801"), DSL.param("sort", "id desc"));
實時 SQL:
select *
from table1
where report_date = '20190801'
order by 'id desc'
order by 子句有問題。
所以。 如何用“id desc”或“name asc”替換參數排序的順序並消除引號?
DSL.param()
創建一個綁定變量,生成為?
在 SQL 中,或者:bizdate
如果您選擇使用命名參數,或者'20190801'
如果您選擇內聯綁定變量。 可以在此處查看有關綁定變量的更多信息。
您不能使用DSL.param()
生成列引用或關鍵字。 列表達式(例如引用)在 jOOQ 表達式樹中由Field
類型描述。 關鍵字是由Keyword
類型描述的,但您可能不想這么低級。 相反,您希望處理查詢表達式中的一些邏輯。 例如:
String sortField = "id";
SortOrder sortOrder = SortOrder.ASC;
Query query = context.select()
.from("table1")
.where(DSL.field("report_date").eq(DSL.param("bizdate")))
.orderBy(DSL.field(sortField).sort(sortOrder));
您所犯的錯誤是認為您可以將單個 SQL 模板用於各種不同的動態 SQL 查詢,但是如果您要動態添加另一個謂詞呢? 還是另一種加入? 還是另一列? 無論如何,您必須構建不同的 jOOQ 表達式樹。 就像這里一樣。 您可以存儲兩個 SQL 字符串(每個排序順序一個),並為每個排序列重復該操作。
但是,我建議您提取一個接受輸入參數並每次重新生成查詢的函數,而不是預先生成單個 SQL 字符串,例如:
ResultQuery<?> query(String bizDate, Field<?> sortField, SortOrder sortOrder) {
return context.selectFrom("table1")
.where(field("report_date").eq(bizDate))
.orderBy(sortField.sort(sortOrder));
}
以下是有關使用 jOOQ 進行動態 SQL 的進一步閱讀:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.