当前位置: 首页 > 知识库问答 >
问题:

Jooq3.15.1新的专用转换API在Kotlin中工作吗?

汪泓
2023-03-14

我试图将Jooq3.15新的Multiset运算符的工作示例转换为Kotlin,但我遇到了一些类型推断问题,无法编译。

到目前为止是这样的:

  • 使用Sakila架构
  • 从jOOQ代码生成步骤生成Kotlin
  • 使用kotlinx.coroutines.jdk-8
  • 中的 Async()扩展方法将Java的 completionstagefuture修改为Kotlin co-例程
    data class Actor(val firstName: String?, val lastName: String?)
    data class Film(val title: String?, val actors: List<Actor>, val 
    categories: List<String>)

    ...

    val future = dsl.select(
        FILM.TITLE,
        multiset(
            select(
                FILM_ACTOR.actor().FIRST_NAME,
                FILM_ACTOR.actor().LAST_NAME
            )
                .from(FILM_ACTOR)
                .where(FILM_ACTOR.FILM_ID.eq(FILM.FILM_ID))
        ).`as`("actors").convertFrom { it.map( mapping(::Actor) ) }, // <--[1]
        multiset(
            select(FILM_CATEGORY.category().NAME)
                .from(FILM_CATEGORY)
                .where(FILM_CATEGORY.FILM_ID.eq(FILM.FILM_ID))
        ).`as`("films").convertFrom { it.map { r -> r.getValue(0) } }
    )
        .from(FILM)
        .orderBy(FILM.TITLE)
        .fetchAsync()

    val result = future.await().map( mapping(::Film) ) // <--[2]

我遇到的问题在代码的[1]和[2]中有说明。

Type mismatch.
Required:  ((String?, String?) → Actor!)!
Found:     KFunction2<String, String, Actor>

目前我还不清楚为什么每个情况下的问题都不同。

我能得到一些指导吗?映射(/*constructor reference*/):RecordManager 是否可以在Jooq3.15.1中与Kotlin一起使用?如果没有,我可以合理地做些什么来解决这个问题?

共有1个答案

竺捷
2023-03-14

关于问题[1],有时不能将属性设置为nullable:这样整个应用程序就会被这个nullable属性所污染。尽管该列在数据库中可能被指定为NOT NULL,但jOOQ(3.15.1)目前不提供非NULL记录字段(因为不能保证它们在例如外部联接中是非NULL)。

对于不可空属性,我找到的最简单的解决方案是以下构造:

    multiset(
        select(
            FILM_ACTOR.actor().FIRST_NAME,
            FILM_ACTOR.actor().LAST_NAME
        )
    .from(FILM_ACTOR)
    .where(FILM_ACTOR.FILM_ID.eq(FILM.FILM_ID))
    ).`as`("actors").convertFrom(List::class.java) { it.map { s -> Actor(s.value1()!!, s.value2()!!) } },
 类似资料:
  • 我禁用了intellij对话框,该对话框要求将Java代码转换为Kotlin代码,在从Java复制粘贴代码到Kotlin时,我认为它总是可以不问就转换,但现在它永远不会转换。如何再次启用此对话框?我找不到任何方法来实现它,现在IDE不再将Java转换为复制+粘贴的Kotlin。

  • null null 它如何记住字符串和double,加宽/上转换应该记住超类的状态和方法。 如何访问子类类型和值?

  • 问题内容: 我正在创建一个日期时间字符串,如下所示: 使用以下代码,我在Firefox中获得无效的日期,但在Chrome中正常运行 在firefox中,date1给我一个无效的日期,但是在chrome中,它的工作正常,主要原因是什么? 问题答案: 您无法以任何方式实例化日期对象。它必须以特定的方式。以下是一些有效的示例: 要么

  • 在那里我等待电子表格的src和dst键。 在ruby中,我使用google_drive gem上传文件并调用Google应用程序脚本

  • 转换操作引入不同类之间的替代性。替代性的意思是一个类可以被另外一个类代替。这有一个好处:一个子类可以代替基类,像下面 shape 继承结构给出例子。你定义基类 Shape 并自定义它的子类: Rectangle , Ellipse , Circle 等。在期望是 Shape 的地方你可以用 Circle 代替它。这是使用多态的替代性。这个是因为 Circle 是 Shape 的一个特别类型。当你创

  • 在Kotlin中,编译以下代码: 但是,该代码不: 编译此代码将导致以下错误: 在Java中,两个示例都无法编译: 不出所料,前面的两个代码片段都会产生熟悉的编译器错误: 令我惊讶的是,第一个 Kotlin 示例根本有效,其次,如果它有效,为什么第二个 Kotlin 示例会失败?Kotlin 是否将方法的返回类型视为其签名的一部分?此外,为什么 Kotlin 中的方法签名与 Java 相比,它遵循