为什么Jooq代码生成与PostGIS有关?

问题描述 投票:0回答:1

背景 - 我正在尝试Postgres的地理信息系统扩展PostGis,它可以将故事经纬度作为Point及其操作。

If I understand correctly然后我需要添加一个自定义转换器,可以在JOOQ和PostGis之间转换point并将其添加到gradle文件中。

问题 - 当我生成jooq代码时,很少生成错误的文件并且定义了两次无法编译的字段。这些是:

<configured-generation-dir>/tables/StValuecount.java
<configured-generation-dir>/tables/records/StValuecountRecord.java
<configured-generation-dir>/tables/records/StValuepercentRecord.java
<configured-generation-dir>/tables/_StValuecount.java
<configured-generation-dir>/tables/records/_StValuecountRecord.java
<configured-generation-dir>/tables/_StHistogram.java
<configured-generation-dir>/tables/records/_StHistogramRecord.java
<configured-generation-dir>/tables/_StQuantile.java

Gradle config =>

jooq{
    myAwesomeApp(sourceSets.main){
        logging = 'WARN'
        jdbc {
            driver = 'org.postgresql.Driver'
            url = db_url
            user = db_user
            password = db_password
        }
        generator {
            name = 'org.jooq.codegen.DefaultGenerator'
            strategy {
                name = 'org.jooq.codegen.DefaultGeneratorStrategy'
            }
            database {
                name = 'org.jooq.meta.postgres.PostgresDatabase'
                inputSchema = 'public'
                forcedTypes {
                    forcedType {
                        userType = 'org.postgis.Point'
                        converter = 'com.example.JooqBreaksWithPostGis.jooq.converters.PostgresPointJooqConverter'
                        expression = '.*\\.point'
                        types = '.*'
                    }
                }
            }
            generate {
                routines = false
                relations = true
                deprecated = false
                records = true
                immutablePojos = false
                fluentSetters = true
            }
            target {
                packageName = 'jooq.fancy.app'
                directory = 'src/main/java/generated'
            }
        }
    }
}

我究竟做错了什么?


我还创建了一个最小的project,我已经重现了这个问题,以防有人想快速尝试它。

Steps to reproduce

  • 结帐项目
git clone [email protected]:raj-saxena/JooqBreaksWithPostGis.git
  • 转到项目目录并使用启动postgis docker容器
docker-compose up
  • 同样,删除postgis docker容器运行
docker-compose down 
  • 运行添加包含City类型的简单Point表的迁移
./gradlew flywayMigrate
  • 我在第二次迁移中添加了几行来验证数据库结构是否正常工作。有关连接到build.gradle文件中的Postgres实例的详细信息。
  • 使用生成jooq文件
./gradlew generateMyAwesomeAppJooqSchemaSource
  • 验证是否在配置的src/main/java/generated目录中生成了文件。
  • 验证上面提到的文件无法编译。

以Lukas的advice为例,我将排除配置添加到jooq配置中,如下所示:

            database {
                name = 'org.jooq.meta.postgres.PostgresDatabase'
                ...
                excludes = '.*ST_ValueCount' +
                        '|.*St_Valuepercent' +
                        '|.*St_Histogram' +
                        '|.*St_Quantile' +
                        '|.*St_Approxhistogram' +
                        '|.*St_PixelOfValue' +
                        '|.*St_Approxquantile' +
                        '|.*ST_Tile'
            }

这允许代码编译。

postgresql build.gradle postgis jooq
1个回答
0
投票

这听起来很像https://github.com/jOOQ/jOOQ/issues/4055。 jOOQ 3.11当前无法处理任何支持表值函数的RDBMS中的重载表值函数。这里你最好的选择是使用<excludes>从代码生成中排除所有受影响的函数:

https://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-database/codegen-database-includes-excludes/

© www.soinside.com 2019 - 2024. All rights reserved.