java - ForceType 检查约束或默认值
问题描述
我在数据库中有如下所示的列:
AKTIV VARCHAR2(1 char) default 'J' not null
constraint AVCON_428946_AKTIV_000 check (AKTIV IN ('J', 'N')),
我如何编写强制类型来生成布尔字段。
到目前为止,我有:
<forcedType>
<userType>java.lang.Boolean</userType>
<converter>db.Varchar2ToBooleanConverter</converter>
<types>VARCHAR2\(1\)</types>
<nullability>NOT_NULL</nullability>
</forcedType>
但是如何包含默认值或检查约束?
解决方案
这是一个非常有趣的用例,jOOQ 目前还不能开箱即用地满足它,但您可以推出自己的实现。一些背景
什么是检查约束
检查约束是可以放置在模式中以验证数据的谓词。虽然在很多情况下,您只会对单个列应用这样的约束,但您必须重复列名AKTIV
这一事实暗示了检查约束的范围实际上是表,而不是列。例如,您可能有一个约束
CONSTRAINT chk CHECK (col1 > 0 AND col2 IN (1, 2))
此约束不能清楚地归因于单个列。但像所有约束一样,它可以清楚地归因于表。
在 PostgreSQL 和 SQL 标准中定义检查约束的一种特殊方法是domain,它们通常用作跨多个表的可重用检查约束。jOOQ 目前不适用于域。一些功能请求包括:
- 添加对类型域的支持
- 让转换器以强制类型匹配 PostgreSQL 域(类似于您的请求)
如何以编程方式在 jOOQ 3.11 中匹配它们
jOOQ-meta 已经公开了CheckConstraintDefinition
类型org.jooq.meta.Database.getCheckConstraints(SchemaDefinition)
如果您编写程序代码生成器配置,那么您可以读取检查约束定义并相应地以编程方式创建您自己的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>
推荐阅读
- java - 如何使用 Java 将 Avro 架构发送到 GCP BigQuery?
- c - “邻居”声明变量的指针运算
- c# - 为并行 API 调用添加延迟
- reactjs - 如何在表格中的反应选择外部滚动中显示菜单样式?
- javascript - 如何将 Node 添加到前端?
- java - 什么解释了 java 中双精度的范围?
- python - ModuleNotFoundError:python 中没有名为“sksurv”的模块
- javascript - 如何在 Node/Express 中设置 404 路由
- r - 在R中的标头上运行forloop
- android - 如何使用房间关系注释一次连接多个对象?