java - 检查约束或默认值的 ForceType

标签 java sql jooq

我在数据库中有如下所示的列:

AKTIV VARCHAR2(1 char) default 'J' not null
    constraint AVCON_428946_AKTIV_000 check (AKTIV IN ('J', 'N')),

我必须如何编写 forcedType 才能生成 boolean 字段。

到目前为止我有:

<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 标准中定义检查约束的一种特殊方式是 domains ,它们通常用作跨多个表的可重用检查约束。 jOOQ 目前不适用于域。一些功能请求包括:

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

jOOQ-meta 已经公开了 CheckConstraintDefinitionorg.jooq.meta.Database.getCheckConstraints(SchemaDefinition) 输入如果你写一个 programmatic code generator configuration ,然后您可以阅读检查约束定义并以编程方式创建您自己的 forcedType相应的配置。这可能(尚未)在所有 SQL 方言中可用。

另一种方法是直接查询数据库的字典 View ,找到您感兴趣的检查约束,然后创建 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 中配置地匹配它们

我刚刚实现了 #8446在 jOOQ 3.12 中,使用它也可以配置地实现上述编程方法。你的<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 - 检查约束或默认值的 ForceType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55341823/

相关文章:

java - QVTO - 导入在 3.4 中有效,但在 3.6 中无效

java - 在 Android 中持久存储数组而不使用 SQLite 的最佳方法

带有结果集的 java.util.stream

sql - 如何使用 jOOQ 使用命名参数而不是问号

java - 在 Spring Boot 中自动重新加载新类

java - 如何将从规则中获取的值保留在变量中并在 ANTLR 语法中重用它?

mysql - 将第一个数据插入到递归sql表中

mysql - SQL:如何将大量列和大量表中的特定值连接到一个查询中?

java - 从存储过程中获取输出参数而不调用 execute()

java - 使用 jooq 插入间隔数据