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

使用jOOQ使用正确的类型转换选择insert from values()

邓子濯
2023-03-14

我正在使用jOOQ向一个多对多关系的表中插入相当多的行。代码可以工作,生成的SQL与预期的一样,我的问题是我希望jOOQ代码可以更简单。

我有一个简化的结构(所有东西都重命名了,大部分字段被删除了,大部分约束被删除了,这只是一个愚蠢但准确的结构示例):

CREATE TABLE person (
    person_id BIGSERIAL PRIMARY KEY,
    person_name VARCHAR(64) NOT NULL UNIQUE
);

CREATE TABLE company (
    company_id BIGSERIAL PRIMARY KEY,
    company_name VARCHAR(100) NOT NULL UNIQUE
);

CREATE TABLE employment_contract (
    company_id BIGINT NOT NULL REFERENCES company,
    person_id BIGINT NOT NULL REFERENCES person,
    PRIMARY KEY (company_id, person_id),

    salary INT NOT NULL,
    creation_date_time TIMESTAMP NOT NULL
);

我的插入代码:

Table<Record4<String, String, Integer, Timestamp>> insertValues = values(
    row(
        cast(null, COMPANY.COMPANY_NAME),
        cast(null, PERSON.PERSON_NAME),
        cast(null, EMPLOYMENT_CONTRACT.SALARY),
        cast(null, EMPLOYMENT_CONTRACT.CREATION_DATE_TIME)
    )
).as("insert_values",
        COMPANY.COMPANY_NAME.getName(),  -- these lines are bugging me
        PERSON.PERSON_NAME.getName(),
        EMPLOYMENT_CONTRACT.SALARY.getName(),
        EMPLOYMENT_CONTRACT.CREATION_DATE_TIME.getName()
);

Insert<AffectedSubscriberRecord> insert = insertInto(EMPLOYMENT_CONTRACT)
    .columns(EMPLOYMENT_CONTRACT.COMPANY_ID,
            EMPLOYMENT_CONTRACT.PERSON_ID,
            EMPLOYMENT_CONTRACT.SALARY,
            EMPLOYMENT_CONTRACT.CREATION_DATE_TIME
    )
    .select(
        select(
            COMPANY.COMPANY_ID,
            PERSON.PERSON_ID,
            insertValues.field(EMPLOYMENT_CONTRACT.SALARY),
            insertValues.field(EMPLOYMENT_CONTRACT.CREATION_DATE_TIME)
        )
        .from(insertValues)
            .join(COMPANY).using(COMPANY.COMPANY_NAME)
            .join(PERSON).using(PERSON.PERSON_NAME)
    );
Table<Record4<String, String, Integer, Timestamp>> insertValues = values(
    row( (String)null, (String)null, (Integer)null, (Timestamp)null )
).as("insert_values",
        COMPANY.COMPANY_NAME.getName(),
        PERSON.PERSON_NAME.getName(),
        EMPLOYMENT_CONTRACT.SALARY.getName(),
        EMPLOYMENT_CONTRACT.CREATION_DATE_TIME.getName()
);
Table<Record4<String, String, Integer, Timestamp>> insertValues = values(
    row( COMPANY.COMPANY_NAME, PERSON.PERSON_NAME, EMPLOYMENT_CONTRACT.SALARY, EMPLOYMENT_CONTRACT.CREATION_DATE_TIME )
).as("insert_values");

是否有任何方法可以实现相同(或等效)的结果查询,而不使用不干净的.getname()调用,直接将字段传递到某个地方?

共有2个答案

单于骁
2023-03-14
热门标签
洪捷
2023-03-14
相关问题
 类似资料:
  • 我试图将PostgreSQL(9.4)UUID绑定到每个UUID周围的包装类数组。请注意,这些包装器在整个应用程序中都是集成的,因此删除它们不是一个选项。我正在使用jOOQ和它的maven插件(3.5.1)来生成PoJo、记录和表类。 我在绑定数据库模式时遇到问题的相关部分如下所示: 然后,我尝试使用forcedType元素转换该类,但它生成的类无法编译。放弃这一点,我只是将它们作为UUID生成,

  • 问题内容: 我知道如何获取mysql行并将其转换为json: 但: 数据库行具有不同的类型,例如int,float,string。通过使用json_encode()进行转换,所有结果都是字符串。 有没有比这更好的方法来更正类型: 我想遍历键并添加0,因为: 第一个编码规则:干-不要重复自己 但我不能,因为: 行还具有数字以外的其他类型(字符串,日期) 有很多列 设计在开发人员中,因此列名经常更改

  • 为了优化存储,在任何情况下均应使用最精确的类型。例如,如果列的值的范围为从1到99999,若使用整数,则MEDIUMINT UNSIGNED是好的类型。在所有可以表示该列值的类型中,该类型使用的存储最少。 用精度为65位十进制数(基于10)对DECIMAL列进行所有基本计算(+、-、*、/)。参见11.1.1节,“数值类型概述”。 使用双精度操作对DECIMAL值进行计算。如果准确度不是太重要或如

  • 也许我错过了什么,如果是这样原谅我的无知。 在这里,我们有什么: 我们在Kafka集群中使用TLS身份验证侦听器(这可以更改,我们可以添加新类型的侦听器) 当从Java代码连接到Kafka主题时,我使用为Kafka用户生成的SSL证书 如果我决定避免使用SSL证书,原因有两个: < li >我将仅从受信任的OpenShift cluster PODs连接到Kafka主题 < li >为了避免在生产

  • 在我的jOOQ配置文件中,我为日期字段定义了一个转换器,但是在forcedType的节中定义类型的条件时遇到了一些问题。 对于测试,我使用了表达式: 以及在类型上: 我希望匹配数据类型为DATE的所有列。取而代之的是,它不匹配任何一个列,除了一个类型为DATE的列之外,就像其他不匹配的列一样,但这个列的def:CURRENT DATE列似乎与此匹配。 为了让它工作,我必须使用: 有人能给我解释一下

  • 我正在使用RestTemboard类发布到基于JSON的RESTful Web服务。我可以从留档中看到,可以有几个MessageConverters可用于RestTem板实例。我面临的问题是,客户端似乎出于某种原因选择使用基于XML的转换器。“内容类型”标头设置为应用程序/XML,消息主体包含我想作为JSON发送的对象的XML表示。如何最容易地配置我的RestTemboard实例,以便为我的请求使