Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 如何在存储库方法中重用/组合JOOQ查询的一部分?_Kotlin_Jooq - Fatal编程技术网

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

Kotlin 如何在存储库方法中重用/组合JOOQ查询的一部分?,kotlin,jooq,Kotlin,Jooq,使用JOOQ DSLContext变量ctx,我有一个选择所有关系数据的方法 open fun selectAllSomethings(id: String): List<SomeDto> = ctx .select(..), .from(..) .join(..) .leftJoin(...) .fetch() .map() 是否有必要将其分为两种不同的方法?或者需要添加一个if?这个答案在语法上并不完美-没有生成的模型,也不知

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

 open fun selectAllSomethings(id: String): List<SomeDto> = ctx
    .select(..), 
    .from(..)
    .join(..)
    .leftJoin(...)
    .fetch()
    .map()

是否有必要将其分为两种不同的方法?或者需要添加一个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,这样更明显的是,它是一个只在上下文(即事务)中使用的函数,也是一个私有函数,使其真正内部化。您可以很容易地将其更改为在上下文中作为参数传递。

下面的答案基于假设,因为显示的工作代码很少,或者您以前尝试过的内容很少,我添加了一个假设,即使用的是JOOQ库。有趣的方法!这允许基于jOOQ的全新迷你SQL语言扩展。次要的挑剔:我会返回一个ResultQuery类型,除非非常清楚SelectOnConditionStep是一个理想的返回类型,即允许调用站点修改最后一个leftJoin谓词。Lukas为了提示,我让类型推断选择返回类型,这太具体了,所以我按照建议更新了ResultQuery,谢谢!
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(...)
}