JOOQ:根据长度将 tinyint 映射到布尔值

Posted

技术标签:

【中文标题】JOOQ:根据长度将 tinyint 映射到布尔值【英文标题】:JOOQ: map tinyint to boolean based on its length 【发布时间】:2019-01-12 14:49:43 【问题描述】:

我当前的 jooq-codegen-maven 配置将所有 tinyint(1) 字段映射到 java 的布尔值:

<forcedTypes>
    <forcedType>
        <name>BOOLEAN</name>
        <types>(?i:TINYINT)</types>
    </forcedType>
</forcedTypes>

问题是在某些情况下,DB 包含标记为 tinyint(3) 的列,不应将其视为布尔值,而是一些真正的 int。不幸的是,我找不到任何示例,文档有一些东西,但它并没有真正为我工作:

<forcedType>
   <name>BOOLEAN</name>
   <types>TINYINT\(1\)</types>
</forcedType>

【问题讨论】:

请注意,即使这样有效,您的正则表达式也会被错误地转义。你的意思是写TINYINT\(1\) 【参考方案1】:

从 jOOQ 3.12 开始

我们已经在代码生成器中实现了对从 mysql 读取数字 display width 的支持。您可以使用以下方式进行匹配:

<forcedType>
  <name>BOOLEAN</name>
  <includeTypes>
    (?i:(TINY|SMALL|MEDIUM|BIG)?INT(UNSIGNED)?\(1\))
  </includeTypes>
</forcedType>

此博客文章对此进行了记录: https://blog.jooq.org/2019/09/27/how-to-map-mysqls-tinyint1-to-boolean-in-jooq/

这是通过以下方式实现的:https://github.com/jOOQ/jOOQ/issues/7719

直到 jOOQ 3.11

在 jOOQ 3.12 之前,jOOQ 代码生成器不考虑 TINYINT 之类的 display width 类型的 &lt;types/&gt; 正则表达式,仅仅是因为它只读取 INFORMATION_SCHEMA.DATA_TYPE(不包含此信息) ,而不是INFORMATION_SCHEMA.COLUMN_TYPE(确实如此)。

如果不能升级到 3.12,您可以:

枚举&lt;forcedType/&gt; 规范中的所有布尔类型 在查询INFORMATION_SCHEMA.COLUMN_TYPE的地方写一个programmatic code generator configuration,生成需要强制输入BOOLEAN的列​​集

【讨论】:

以上是关于JOOQ:根据长度将 tinyint 映射到布尔值的主要内容,如果未能解决你的问题,请参考以下文章

将 tinyint 映射为布尔休眠

使用休眠映射布尔值

如何将 Postgresql 布尔值转换为 MySQL Tinyint?

为啥 MySQL 将布尔值解释为 TINYINT(1) 而不是 BIT(1)?

在 Symfony 中使用 Doctrine 的 DBAL 检索布尔值

通过使用 Jooq 和 JPA 的 @Column 注释来验证字段长度