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

尝试使用POJO记录更新表时出现Java jOOQ问题

章景同
2023-03-14

我试图执行一个简单的更新记录函数,但它给我一个错误,我找不到原因或任何其他人有它。

可以在以下位置找到示例测试项目: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中执行更新(R)

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

观察。:我有2个数据库(Firebird和h2),我使用Gradle的jOOQ生成器自动生成pojos和其他类。他们不共享POJOs或任何复杂的东西。该项目非常小而简单。

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

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

共有2个答案

狄晟睿
2023-03-14

问题似乎出在nu.studer身上。jooq插件,因为当使用另一个代码生成器时,反映主键表的H2数据库模型类接收可更新表扩展/实现。

我在插件上打开了一个问题,对于那些想关注它的人,你可以在插件github页面中查看打开的问题,上面已经链接了几行。

插件的新版本(版本3. x)似乎已经修复了这个问题。升级时要小心,因为插件配置中有许多重大更改,并且它还强制使用新的jOOQ版本(3.11)。

桂宏旷
2023-03-14

DSLContext。executeUpdate(R)要求R是可更新记录(UpdateRecord)的子类型,这很有意义。只有“可更新”(即知道其主键)的记录才能有效更新。

似乎您的ExpressaoRecord不是一个可更新的记录,而只是一个表记录。这可能有几个原因:

<代码>

如果没有主键,代码生成器不会生成可更新的记录。

您可以将主键添加到表中,或者告诉代码生成器有关“合成主键”的信息:

https://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-database/codegen-database-synthetic-primary-keys/

或者,您可以通过将任何唯一键视为主键来“覆盖”主键:

https://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-database/codegen-database-override-primary-keys/

 类似资料:
  • 我有一个表,我想用另一个表中的值更新该表,我正在使用以下代码: 尽管事实上,表。id是tableA的主键,我不断得到以下错误: 错误代码:1175。您使用的是安全更新模式,并且您试图更新一个没有使用键列禁用安全模式的表,请在“首选项”中切换该选项- 我做错了什么?

  • 问题内容: 我尝试通过bash脚本执行此命令,但出现以下错误: 错误stacktrace: {“错误”:“ IndexPrimaryShardNotAllocatedException [[my_index]主要未分配后api]”,“状态”:409} {“错误”:“ ElasticSearchIllegalArgumentException [无法更新非动态设置[[index.analysis.f

  • 我在尝试更新我的Eclipse时出错! 以下是在“安装下载0”期间发生内部错误的错误日志 Java . lang . illegalargumentexception:比较法违反了它的通用契约!at Java . util . comparabletimsort . merge hi(comparabletimsort . Java:835)at Java . util . comparablet

  • 我想使用POJO作为源来更新JOOQ记录中更改的字段<代码>记录。from(Object)几乎正确,但根据文档 结果记录的所有值的内部“更改”标志都将设置为true。 我只希望实际更改的字段(由对象决定。等于(对象,对象))更新其标志。 这有两个原因: 我不想触发插入

  • 问题内容: 我有这个: 当我做一个我得到: 在probleme我有是附加在 有人可以帮忙吗,谢谢 问题答案: 尝试以下代码(已修复):

  • UPDATE IDConfig设置女性ID=女性ID 1; 获取错误,如您正在使用安全更新模式,并且您试图更新一个没有使用KEY列的WHERE的表要禁用安全模式,请在首选项中切换选项-