【发布时间】:2021-04-30 17:26:42
【问题描述】:
我们有一个在不同情况下使用的具有通用结构的查询(where 子句不同)
所以我们有这样的东西
val baseQuery: SelectQuery<Record> = dsl
.select(someFields)
.from(someTable)
.join(otherTable).on(joinClause)
.query
在其他地方,我们会根据需要扩展此查询。
baseQuery.apply {
addConditions(conditionsA)
}.fetch()
baseQuery.apply {
addConditions(conditionsB)
}.fetch()
到目前为止一切顺利。但是现在,如果我们能以某种方式将此基础与 CTE 结合使用,那就太酷了。不过不知道该怎么做。
val someCTE: CommonTableExpression<*> = DSL.....
// dsl
// .with(someCTE)
// .selectQuery(baseQuery.apply {}) ¯\_(ツ)_/¯
baseQuery.apply {
// addWith(someCTE) ¯\_(ツ)_/¯
addSelect(someCTE.field(cteField))
addJoin(someCTE, joinClause)
addConditions(conditionsC)
}
有办法吗?也许其他建议如何在使用 CTE 时重用基本查询?
编辑:解决方案
在 Lukas 的回答的帮助下,我决定采用这种方法
fun dynamicQuery(
context: SelectSelectStep<*> = dsl.select(),
selects: List<Field<*>> = listOf(),
joins: List<Pair<Table<*>, Condition>> = listOf(),
conditions: List<Condition> = listOf()
): SelectQuery<Record>
所以在正常的自定义中我可以
dynamicQuery(
conditions = conditionsA
).fetch()
dynamicQuery(
conditions = conditionsB
).fetch()
它可以与 CTE 结合使用
val someCTE: CommonTableExpression<*> = DSL.....
dynamicQuery(
context = dsl.with(someCTE).select(),
selects = listOf(someCTE.field(cteField)),
joins = listOf(someCTE to joinClause),
conditions = conditionsC
).fetch()
【问题讨论】:
标签: common-table-expression jooq