检查约束或默认值上的ForceType
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了检查约束或默认值上的ForceType相关的知识,希望对你有一定的参考价值。
我在数据库中的列看起来像:
AKTIV VARCHAR2(1 char) default 'J' not null
constraint AVCON_428946_AKTIV_000 check (AKTIV IN ('J', 'N')),
如何编写forcedType以获取生成的布尔字段。
到目前为止,我有:
<forcedType>
<userType>java.lang.Boolean</userType>
<converter>db.Varchar2ToBooleanConverter</converter>
<types>VARCHAR2\(1\)</types>
<nullability>NOT_NULL</nullability>
</forcedType>
但是,如何包含默认值或检查约束?
这是一个非常有趣的用例,jOOQ目前还不能满足开箱即用,但你可以自己实现。一些背景
What's a check constraint
检查约束是可以放置在模式中以验证数据的谓词。虽然在很多情况下,您只会在单个列上应用这样的约束,但是您必须重复列名称AKTIV
这一事实暗示了检查约束的范围实际上是表,而不是列。例如,您可以有一个约束
CONSTRAINT chk CHECK (col1 > 0 AND col2 IN (1, 2))
此约束不能明确归因于单个列。但是像所有约束一样,它可以清楚地归因于表格。
在PostgreSQL和SQL标准中定义检查约束的一种特殊方法是domains,它们通常用作跨多个表的可重用检查约束。 jOOQ目前不适用于域名。一些功能请求包括:
How to match them in jOOQ 3.11, programmatically
jOOQ-meta已经从CheckConstraintDefinition
公开了org.jooq.meta.Database.getCheckConstraints(SchemaDefinition)
类型如果你写了一个programmatic code generator configuration,那么你可以阅读检查约束定义并以编程方式相应地创建自己的forcedType
配置。这可能尚未在所有SQL方言中可用。
另一种方法是直接查询数据库的字典视图,找到您感兴趣的检查约束,然后根据这些配置创建forcedType
配置。例如,在Oracle中,您可以编写:
SELECT regexp_replace(search_condition_vc, '(\w+).*', '\1')
FROM all_constraints
WHERE constraint_name LIKE 'AVCON%' -- Add further restrictions here
AND regexp_like(search_condition_vc, 'IN\s*\(\s*''J''\s*,\s*''N''\s*\)')
从预计的SEARCH_CONDITION
,您现在可以使用正则表达式再次提取受影响的列名称。显然,您可能需要根据您对域名的了解调整上述逻辑。
How to match them in jOOQ 3.12, configuratively
我刚刚在jOOQ 3.12中实现了#8446,使用它可以使用上述编程方法进行配置实现。你的<forcedType>
看起来像这样:
<forcedType>
<userType>java.lang.Boolean</userType>
<converter>db.Varchar2ToBooleanConverter</converter>
<!-- Place your SQL statement here -->
<sql>
SELECT regexp_replace(search_condition_vc, '(\w+).*', '\1')
FROM all_constraints
WHERE constraint_name LIKE 'AVCON%' -- Add further restrictions here
AND regexp_like(search_condition_vc, 'IN\s*\(\s*''J''\s*,\s*''N''\s*\)')
</sql>
<!-- These may not be strictly needed -->
<types>VARCHAR2\(1\)</types>
<nullability>NOT_NULL</nullability>
</forcedType>
以上是关于检查约束或默认值上的ForceType的主要内容,如果未能解决你的问题,请参考以下文章