我有一个和另一个有一对一关系的表,但有两个,src和dst,如何正确地连接它?我做了类似的事情,但不确定这是最好的做法:

 val route = tbl.`as`("route")
 val srcPlace = Tables.PLACE.`as`("srcPlace")
 val dstPlace = Tables.PLACE.`as`("dstPlace")

 val records = dsl
        .select(route.asterisk())
        .select(srcPlace.asterisk())
        .select(dstPlace.asterisk())
        .from(route)
        .join(srcPlace).on(route.SRC_ID.eq(srcPlace.ID))
        .join(dstPlace).on(route.DST_ID.eq(dstPlace.ID))
        .limit(pageable.pageSize)
        .offset(pageable.offset)
        .fetch {
            val r = it.into(route).into(RouteEntity::class.java)
            val sP = it.into(srcPlace).into(PlaceEntity::class.java)
            val dP = it.into(dstPlace).into(PlateEntity::class.java)
            r.srcPlace = sP
            r.dstPlace = dP
            r
        }

如何做得更好?

推荐答案

最简单的方法(从jOOQ 3.17和the ability of projecting table expressions as SelectField开始)是只投影表本身,例如:

dsl.select(route, srcPlace, dstPlace)
   . // query
   .fetch {
       val (r, sP, dP) = it
       // ...
   }

在您的特定情况下,您甚至可以使用implicit joins来进一步简化事情

// Assuming you named your foreign keys "src" and "dst"
dsl.select(route, route.src, route.dst)
   .from(route)
   .limit(pageable.pageSize)
   .offset(pageable.offset)
   .fetch {
       val (r, sP, dP) = it
       // ...
   }

甚至,如果不进行it次分解:

// Assuming you named your foreign keys "src" and "dst"
dsl.select(route, route.src, route.dst)
   .from(route)
   .limit(pageable.pageSize)
   .offset(pageable.offset)
   .fetch { (r, sP, dP) ->
       // ...
   }

Kotlin相关问答推荐

调用即发即忘方法--哪个作用域?

相当于roomdb中的DateTime Bigint列的是什么

数据源配置

哪个更好? Integer.valueOf(readLine()) 或 readLine()!!.toInt()

Kotlin 获取继承类的默认 hashCode 实现

Kotlin 中获取类简单名称的最佳实践

在 kotlin 中写入 parcer 可空值

Kotlin 1.2.21 + SimpleXml 2.3.0 - consume List error (must mark set get method)

创建首选项屏幕时找不到androidx.preference.PreferenceScreen

TextField maxLength - Android Jetpack Compose

Android Studio 将 Java 转换为 Kotlin 错误无法推断此参数的类型

面临一些未知问题一些后端jvm内部错误

Kotlin通过映射委托属性,如果映射中不存在,则抛出NoTouchElementException

是否在Kotlin中重写enum toString()?

用Gradle Kotlin DSL构建源jar?

TypeConverter()在Android的TypeConverter错误中具有私有访问权限

从命令行运行Java到Kotlin转换器?

我应该使用Kotlin数据类作为JPA实体吗?

Android Kotlin .visibility

Kotlin中的函数接口