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