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 类型的 <types/>
正则表达式,仅仅是因为它只读取 INFORMATION_SCHEMA.DATA_TYPE
(不包含此信息) ,而不是INFORMATION_SCHEMA.COLUMN_TYPE
(确实如此)。
如果不能升级到 3.12,您可以:
枚举<forcedType/>
规范中的所有布尔类型
在查询INFORMATION_SCHEMA.COLUMN_TYPE
的地方写一个programmatic code generator configuration,生成需要强制输入BOOLEAN
的列集
【讨论】:
以上是关于JOOQ:根据长度将 tinyint 映射到布尔值的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Postgresql 布尔值转换为 MySQL Tinyint?
为啥 MySQL 将布尔值解释为 TINYINT(1) 而不是 BIT(1)?