可用版本: 开发版 (3.21) | 最新 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14

嵌入式域

适用于 ❌ 开源版   ✅ Express 版   ✅ 专业版   ✅ 企业版

嵌入式类型的一个非常有用的应用是类型。 DOMAIN 类型是以下组合:

  • 语义类型名称
  • 数据类型(或其他域类型)
  • 默认值
  • CHECK 约束

名称/类型的组合足以描述您模式中的 EMAIL 等语义类型,这比例如 VARCHAR(10) 要好得多。通过嵌入式域,您可以为每个域类型生成一个 Java 类型,并将其自动附加到所有列。

您可以像这样启用该功能

XML(独立和 Maven)
编程方式
Gradle (Kotlin)
Gradle (Groovy)
Gradle(第三方)
<configuration>
  <generator>
    <database>

      <!-- Use regular expressions to match the domains that should be replaced by embeddables. -->
      <embeddableDomains>.*</embeddableDomains>
    </database>
  </generator>
</configuration>

有关更多详细信息,请参阅配置 XSD独立代码生成 Maven 代码生成

new org.jooq.meta.jaxb.Configuration()
  .withGenerator(new Generator()
    .withDatabase(new Database()

      // Use regular expressions to match the domains that should be replaced by embeddables.
      .withEmbeddableDomains(".*")
    )
  )

有关更多详细信息,请参阅配置 XSD编程代码生成

import org.jooq.meta.jaxb.*


configuration {
  generator {
    database {

      // Use regular expressions to match the domains that should be replaced by embeddables.
      embeddableDomains = ".*"
    }
  }
}

有关更多详细信息,请参阅配置 XSD Gradle 代码生成

configuration {
  generator {
    database {

      // Use regular expressions to match the domains that should be replaced by embeddables.
      embeddableDomains = ".*"
    }
  }
}

有关更多详细信息,请参阅配置 XSD Gradle 代码生成

// The jOOQ-codegen-gradle plugin has been introduced in version 3.19.
// Please use the official plugin instead of the third party plugin that was recommended before.

一如既往,当使用正则表达式时,它们是具有默认标志的正则表达式

这将为每个 DOMAIN 自动生成一个嵌入式类型配置。例如,此模式

CREATE DOMAIN email AS varchar(100);
CREATE DOMAIN year AS int;

CREATE TABLE user (
  id bigint NOT NULL PRIMARY KEY,
  name varchar(100) NOT NULL,
  email email NOT NULL,
  created year NOT NULL
);

以上将生成以下一组类(简化版)

public class EmailRecord extends EmbeddableRecordImpl<EmailRecord> {
    public void setValue(String value) { ... }
    public String getValue() { ... }
    public EmailRecord() { ... }
    public EmailRecord(String value) { ... }
}

public class YearRecord extends EmbeddableRecordImpl<YearRecord> {
    public void setValue(Integer value) { ... }
    public Integer getValue() { ... }
    public YearRecord() { ... }
    public YearRecord(Integer value) { ... }
}

这些类现在被 User 表和 UserRecord 记录中的嵌入式字段引用(简化版)

public class User extends TableImpl<UserRecord> {
    public final TableField<UserRecord, Integer> ID;
    public final TableField<UserRecord, String> NAME;
    public final TableField<UserRecord, EmailRecord> EMAIL;
    public final TableField<UserRecord, YearRecord> CREATED;
}

通过这些生成的字段,您可以创建类型安全的语义查询

create.insertInto(USER)
      .columns(USER.ID, USER.NAME, USER.EMAIL, USER.CREATED)
      .values(1, "domain_user", new EmailRecord("domain@user.com"), new YearRecord(2020))
      .execute();

反馈

您对此页面有什么反馈吗?我们很乐意听取!

The jOOQ Logo