嵌入式域
适用于 ❌ 开源版 ✅ 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(".*")
)
)
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();
反馈
您对此页面有什么反馈吗?我们很乐意听取!