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