如何使用jOOQ从模板按参数生成SQL?

问题描述

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的更多信息:

解决方法

我使用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” 用param 排序 替换订单并消除引号?

猜你在找的技术问答相关文章

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
Java中的RESTful调用
Swing / Java:如何正确使用getText和setText字符串
特殊字符和重音字符
Android Studio中的ndk.dir错误
错误“找不到主类”