【问题标题】:JOOQ forcedTypes to BooleanJOOQ 强制类型为布尔值
【发布时间】:2015-12-17 17:30:48
【问题描述】:

代码生成工作正常。 db char(1) field1,field2 映射到代码库中的布尔值。

 <forcedTypes>
                <forcedType>
                    <name>BOOLEAN</name>
                    <expressions>field1,field2
                    </expressions>
                </forcedType>
            </forcedTypes>

但是在插入数据库时​​,我得到了

A truncation error was encountered trying to shrink CHAR 'false' to length 1. Error

JOOQ生成的sql是insert into mytable ("field1", "field2", ) values (cast(? as boolean), cast(? as boolean))

这是试图在数据库中插入假/真,但我想插入 1 或 0。 需要帮忙。

我有用于开发功能测试的 Derby 和用于其他环境的 oracle。我为两个数据库使用相同的 JOOQ 生成的存根(使用 Derby DB 生成)。这似乎对 Oracle 工作正常,但对 Derby 则不然。

http://blog.jooq.org/tag/boolean-data-type/ 声明 Oracle 支持,而 Derby 将不支持这种转换。需要变通。

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

    在代码生成器中使用数据类型重写

    您目前正在代码生成器配置中使用 "data type rewriting" 功能。这意味着 jOOQ 的运行时不知道数据库中的实际数据类型。它只是表现得好像数据类型真的 IS BOOLEAN。这意味着:

    • Oracle JDBC 驱动程序会将您的 Java boolean 绑定值转换为 10 用于 NUMBER 列,或转换为 '1''0' 用于字符串列。
    • Derby JDBC 驱动程序不会转换此类型,而是希望数据库中有一个真正的 BOOLEAN 列。

    如果您想以这种方式继续,则必须将 Derby 列类型设置为实际的 BOOLEAN,而不是 CHAR(1)

    在代码生成器中指定Converter

    另一种选择是改用 jOOQ Converter,在将值传递给数据库之前,将 Java boolean 转换为 Java String首先。这样,您可以在两个数据库中使用相同的数据类型。 This is documented here, in the manual.

    【讨论】:

      猜你喜欢
      • 2016-09-04
      • 1970-01-01
      • 2022-01-18
      • 2014-07-21
      • 2021-11-15
      • 1970-01-01
      • 2012-12-16
      • 2012-07-01
      • 1970-01-01
      相关资源
      最近更新 更多