我如何在存储库方法中 reused/compose JOOQ 查询的一部分?
How i can reused/compose part of a JOOQ query in a repository method?
使用 JOOQ DSLContext
变量 ctx
我有一个方法可以 select 所有关系数据。
open fun selectAllSomethings(id: String): List<SomeDto> = ctx
.select(..),
.from(..)
.join(..)
.leftJoin(...)
.fetch()
.map()
而且我需要通过 add
方法重用此逻辑,具体 id
我想更改代码以使用 fetchOne
和 map
。如何重用查询的第一部分并在两种方法之间共享?这部分:
ctx.select(..),
.from(..)
.join(..)
.leftJoin(...)
有必要把这个分成两种不同的方法吗?或者需要添加一个 if
?
这个答案在语法上并不完美——没有您生成的模型,也不知道完整的类型,我只能展示一个粗略的示例。解决方案基本上是其他两种方法使用的共享方法:
private fun DSLContext.baseThingQuery(id: String): ResultQuery<Record> {
return select(...)
.from(...)
.join(...).on(...)
.leftJoin(...).on(...)
}
fun fetchAllThings(id: String): List<ThingDto> {
return ctx.baseThingQuery(id).fetch(...).map(...)
}
fun doSomethignWithOneThing(id: String): ThingDto {
return ctx.baseThingQuery(id).fetchOne(...).map(...)
}
注意: 我使共享效用函数扩展了 DSLContext
只是为了更明显地表明它是一个函数仅在上下文(即事务)中使用,并且 private
使其真正内部使用。您可以轻松地将其更改为将上下文作为参数传递。
使用 JOOQ DSLContext
变量 ctx
我有一个方法可以 select 所有关系数据。
open fun selectAllSomethings(id: String): List<SomeDto> = ctx
.select(..),
.from(..)
.join(..)
.leftJoin(...)
.fetch()
.map()
而且我需要通过 add
方法重用此逻辑,具体 id
我想更改代码以使用 fetchOne
和 map
。如何重用查询的第一部分并在两种方法之间共享?这部分:
ctx.select(..),
.from(..)
.join(..)
.leftJoin(...)
有必要把这个分成两种不同的方法吗?或者需要添加一个 if
?
这个答案在语法上并不完美——没有您生成的模型,也不知道完整的类型,我只能展示一个粗略的示例。解决方案基本上是其他两种方法使用的共享方法:
private fun DSLContext.baseThingQuery(id: String): ResultQuery<Record> {
return select(...)
.from(...)
.join(...).on(...)
.leftJoin(...).on(...)
}
fun fetchAllThings(id: String): List<ThingDto> {
return ctx.baseThingQuery(id).fetch(...).map(...)
}
fun doSomethignWithOneThing(id: String): ThingDto {
return ctx.baseThingQuery(id).fetchOne(...).map(...)
}
注意: 我使共享效用函数扩展了 DSLContext
只是为了更明显地表明它是一个函数仅在上下文(即事务)中使用,并且 private
使其真正内部使用。您可以轻松地将其更改为将上下文作为参数传递。