我可以重用/组成一个存储库方法JOOQ查询的一部分?
使用DSLContext
变量ctx
我有一个方法来选择所有的关系数据。
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
以使其成为真正的内部功能。 您可以轻松地将其更改为在参数中传递。