我如何在存储库方法中重用/组合JOOQ查询的一部分?

时间:2017-05-25 18:23:55

标签: kotlin jooq

使用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

1 个答案:

答案 0 :(得分:3)

这个答案在语法上并不完美 - 没有你生成的模型,也不知道我只能展示粗略样本的完整类型。该解决方案基本上是另外两种方法使用的共享方法:

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