我可以重用/组成一个存储库方法JOOQ查询的一部分?

使用DSLContext变量ctx我有一个方法来选择所有的关系数据。

  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以使其成为真正的内部功能。 您可以轻松地将其更改为在参数中传递。