强制类型在检查约束或默认值中的应用

3

我在数据库中有如下格式的列:

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>

但是我该如何包含默认值或检查约束条件?
1个回答

2
这是一个非常有趣的用例,jOOQ目前还不能直接满足,但您可以自己实现。一些背景信息:
什么是检查约束?
检查约束是一种可以放置在模式中以验证数据的谓词。虽然在很多情况下,您只会将此约束应用于单个列,但必须重复列名“AKTIV”表明检查约束的范围实际上是表,而不是列。例如,您可以有一个约束条件。
CONSTRAINT chk CHECK (col1 > 0 AND col2 IN (1, 2))

此限制无法明确归因于单个列。但像所有约束一样,它可以明确归因于表。
在PostgreSQL和SQL标准中定义检查约束的一种特殊方式是,它们经常被用作可重用的检查约束,跨越多个表。jOOQ目前不支持域。一些功能请求包括:

如何在jOOQ 3.11中以编程方式匹配它们

jOOQ-meta已经从`org.jooq.meta.Database.getCheckConstraints(SchemaDefinition)`中公开了`CheckConstraintDefinition`类型。如果您编写一个程序代码生成器配置,那么您可以读取检查约束定义并根据此自行创建`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 中,您现在可以再次使用正则表达式提取受影响的列名。显然,您可能需要根据您对领域的了解来调整上述逻辑。
如何在 jOOQ 3.12 中进行配置匹配
我刚刚在 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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接