我用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 param sort替换为“id desc”或“name asc”,并删除引号?
DSL. param()
创建一个绑定变量,在SQL中生成为?
,如果您选择使用命名参数,则生成: bizdate
,如果您选择内联绑定变量,则生成'20190801'
。更多关于绑定变量的信息可以在这里看到。
您不能使用DSL。param()生成列引用或关键字。列表达式(例如引用)在jOOQ表达式树中由字段类型描述。关键字由关键字类型描述,但您可能不想达到这么低的级别。相反,您希望处理查询表达式中的一些逻辑。例如:
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字符串,我建议您提取一个函数,该函数接受输入参数并每次重新生成查询,例如:
java prettyprint-override">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模板。 SQL模板: 将存储SQL模板,并根据实时查询条件确定参数。 实时SQL: order by子句有问题。 所以。如何用 “ id desc” 或 “ name asc” 用param 排序 替换订单并消除引号? 问题答案: 创建一个绑定变量,该绑定变量的生成方式与SQL一样,或者您选择使用命名参数,或者选择内联绑定变量。有关绑定变
MySQL不接受此处生成的datetime值。我探索并发现jOOQ转换器可以用于自定义转换。我可以找到如何在获取数据时使用转换的示例,但无法弄清楚如何在查询时使用转换器。如何使用jOOQ转换器生成SQL而不生成代码?或者是否有更好的方法为SQL生成此查询。
我目前正在尝试使用JOOQ基于我现有的postgresdb生成类。在我的约克。xml config I省略了任何inputSchema标记,以便JOOQ生成它找到的所有模式: 但是,我想从生成的内容中排除信息模式。有没有办法以黑名单的方式做到这一点?还是必须为除信息模式之外的所有模式添加输入模式?
我希望一个类有两种不同的实现,并根据布尔模板参数进行选择。我尝试使用本答案中描述的SFINAE原则,如下所示: 然而,我在gcc下遇到了一个错误“不能在类范围内专门化函数”,我不明白为什么。虽然我的代码与链接答案中的代码并不完全相同,但它似乎非常相似,我无法发现关键的区别。 我还尝试使用类似于此答案中建议的语法,但也不起作用(错误是“不能重新声明类成员”): 我怎样才能做到这一点?
我正在考虑使用jOOQ作为一个typesafe、DB方言独立的SQL生成器,因为我需要在一个较大的应用程序中动态创建一个小型数据库DDL脚本和大量INSERT-和UPDATE语句。然后我们提供文件作为下载。 我想为用户提供一个可供选择的不同DB方案,以便导出到:、、,如果许可是商业许可,则可以选择、等。 当然,我可以手工为每个RDBMS重新创建基本模式,但这很乏味,容易出错,而且似乎是多余的:难道
我有以下问题:一个类模板a,有几个模板参数,我想构建一个类B,它以a为模板参数,并提取a的第一个模板参数,以便在某种方法中使用它(想想从std::vector 中提取int并返回默认的int{})。 我知道这种天真的方法不会编译,但我不知道如何实现这样的东西。感谢任何提示。