JOOQ forcedTypes to Boolean

JOOQ forcedTypes to Boolean

代码生成工作正常。 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))

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

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

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

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

您目前正在代码生成器配置中使用 "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 first,然后将值传递给数据库。这样,您就可以在两个数据库中使用相同的数据类型。 This is documented here, in the manual.