我如何在存储库方法中 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 我想更改代码以使用 fetchOnemap。如何重用查询的第一部分并在两种方法之间共享?这部分:

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 使其真正内部使用。您可以轻松地将其更改为将上下文作为参数传递。