jooq + scala 代码生成:对象 AbstractKeys 中的方法 createIndex 无法在对象 org.jooq.impl.AbstractKeys 中访问

Posted

技术标签:

【中文标题】jooq + scala 代码生成:对象 AbstractKeys 中的方法 createIndex 无法在对象 org.jooq.impl.AbstractKeys 中访问【英文标题】:jooq + scala code generation: method createIndex in object AbstractKeys cannot be accessed in object org.jooq.impl.AbstractKeys 【发布时间】:2018-06-28 10:45:41 【问题描述】:

我有生成 jooq 代码的 sbt 任务

val generateJOOQ = taskKey[Seq[File]]("Generate JooQ classes")

val generateJOOQTask = (sourceManaged, fullClasspath in Compile, runner in Compile, streams) map  (src, cp, r, s) =>
  toError(r.run("org.jooq.util.GenerationTool", cp.files, Array("conf/jooq.xml"), s.log))
  ((src / "main/generated") ** "*.scala").get


generateJOOQ <<= generateJOOQTask

unmanagedSourceDirectories in Compile += sourceManaged.value / "main/generated"

这里是jooq.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration xmlns="http://www.jooq.org/xsd/jooq-codegen-3.10.4.xsd">
    <jdbc>
        <driver>org.postgresql.Driver</driver>
        <url>jdbc:postgresql://localhost/postgres</url>
        <user>postgres</user>
        <password>postgres</password>
    </jdbc>
    <generator>
        <name>org.jooq.util.ScalaGenerator</name>
        <database>
            <name>org.jooq.util.postgres.PostgresDatabase</name>
            <inputSchema>public</inputSchema>
            <includes>.*</includes>
            <excludes></excludes>
        </database>
        <target>
            <packageName>generated</packageName>
            <directory>target/scala-2.12/src_managed/main</directory>
        </target>
    </generator>
</configuration>

我使用 scala 2.12.4

代码生成良好。

但是当我编译项目时,出现编译错误。

.../scala-2.12/src_managed/main/generated/Indexes.scala:58: 方法 对象中的 createIndex AbstractKeys 无法在对象中访问 org.jooq.impl.AbstractKeys [错误] 不允许访问受保护的方法 createIndex,因为 [错误] 前缀类型 org.jooq.impl.AbstractKeys.type 不符合 [错误] 发生访问的对象索引中的对象 Indexes0 [错误] val PENDING_USERS_EMAIL_IDX : Index = AbstractKeys.createIndex("pending_users_email_idx", PendingUsers.PENDING_USERS, ArrayOrderField [_] , 错误)

当我尝试降级到 scala 2.12.3 时,它工作正常。

是否有任何解决方案可以使其与 scala 2.12.4 一起使用?

我不想降级 scala 版本。它开始让我感到沮丧,即使是小版本(2.12.4 - 2.12.3)也不向后兼容??

【问题讨论】:

【参考方案1】:

这是 Scala 2.12.4 编译器中已知的回归。此处记录了一种解决方法:https://github.com/jOOQ/jOOQ/issues/6875

您可以对生成的 jOOQ 代码进行后处理,直到编译器问题在 2.12.5 中得到修复:

搜索

AbstractKeys.createUniqueKey(TAuthor.T_AUTHOR, "PK_T_AUTHOR", TAuthor.T_AUTHOR.ID)

替换

org.jooq.tools.reflect.Reflect.on(classOf[AbstractKeys])
   .call("createUniqueKey", TAuthor.T_AUTHOR, "PK_T_AUTHOR", TAuthor.T_AUTHOR.ID).get()

【讨论】:

以上是关于jooq + scala 代码生成:对象 AbstractKeys 中的方法 createIndex 无法在对象 org.jooq.impl.AbstractKeys 中访问的主要内容,如果未能解决你的问题,请参考以下文章

Scala:使用带有布尔方法的 jOOQ DSL

升级 Play/Scala/SBT/jOOQ/HSQLDB 应用程序时出错

如何在 jOOQ 中使用 Scala 的字符串插值?

使用 scala 在 Jooq 中进行交易和条件更新

Jooq postgre 在 play2.5 scala 中插入错误

从 GCP 到本地的 Scala sql 查询远程访问错误