繁体   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