簡體   English   中英

如何使用jOOQ按參數順序從模板生成SQL?

[英]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.

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