代码之家  ›  专栏  ›  技术社区  ›  BBacon

尝试使用POJO记录更新表时的JavaJooq问题

  •  2
  • BBacon  · 技术社区  · 6 年前

    我正在尝试执行一个简单的updateRecord函数,但是它给了我一个错误,我找不到原因或者其他人有这个错误。

    示例测试项目位于: https://github.com/billbarni/jooq-studer-h2-test

    java代码:

    import static mypackage.database.model.h2.public_.Tables.EXPRESSAO;
    import mypackage.database.model.h2.public_.tables.pojos.Expressao;
    import mypackage.database.model.h2.public_.tables.records.ExpressaoRecord;
    
    public void updateQuery(Expressao expressaoPojo) {
      ExpressaoRecord expressaoRecord = ctx.newRecord(EXPRESSAO, expressaoPojo);
      ctx.executeUpdate(expressaoRecord); // Error with this parameter
    }
    

    数据库创建表达式:

    CREATE TABLE
     expressao (
      id INT AUTO_INCREMENT PRIMARY KEY NOT NULL,
      nome VARCHAR(50) NOT NULL,
      conteudo VARCHAR NOT NULL,
      qtd_tempo INT NOT NULL,
      tipo_tempo VARCHAR(5) NOT NULL,
      data_inicial TIMESTAMP NOT NULL
     );
    

    梯度发生器配置:

    plugins {
        id 'nu.studer.jooq' version '2.0.9'
    }
    
    dependencies {
        compile group: 'org.jooq', name: 'jooq-codegen', version: '3.10.4'
        jooqRuntime 'com.h2database:h2:1.4.197'
    }
    
    jooq {
        h2(sourceSets.main) {
            jdbc {
                driver = 'org.h2.Driver'
                url = 'jdbc:h2:file:./db'
                user = 'sa'
                password = ''
            }
            generator {
                name = 'org.jooq.util.DefaultGenerator'
                strategy {
                    name = 'org.jooq.util.DefaultGeneratorStrategy'
                }
                database {
                    name = 'org.jooq.util.h2.H2Database'
                }
                generate {
                    relations = true
                    deprecated = false
                    records = true
                    immutablePojos = true
                    fluentSetters = true
                }
                target {
                    packageName = 'mypackage.database.model.h2'
                    directory = 'src/main/java'
                }
            }
        }
    }
    

    Java在编译之前给了我这个错误:

    dslcontext_中的executeUpdate(r)不能应用于 (mypackage.database.model.h2.public_uuuTables.records.expressaoRecord) 原因:不存在类型变量r的实例,因此 ExpressAORecord符合可更新的记录

    这个问题背后的原因是什么?我做错什么了?

    obs.:我有两个数据库(firebird和h2),我使用Gradle的jooq生成器自动生成pojos和其他类。他们不共享pojos或任何复杂的东西。这个项目很小很简单。

    表2:我使用了几个版本的jooq库(从3.9到新的3.11),问题仍然存在。

    卢卡斯·埃德尔,约克之神,我期待着你的归来,把我从这漫长的沉睡中拯救出来。

    2 回复  |  直到 6 年前
        2
  •  0
  •   BBacon    6 年前

    nu.studer.jooq 插件,因为当使用另一个代码生成器时,反映带有主键的表的h2数据库模型类接收可更新的扩展/实现。

    插件的新版本(3.x+版本)似乎已经解决了这个问题。升级时要小心,因为插件配置中有许多破坏性的更改,它也强制使用新的jooq版本(3.11+)。