代码之家  ›  专栏  ›  技术社区  ›  neo007

JOOQ强制类型为布尔型

  •  2
  • neo007  · 技术社区  · 11 年前

    代码生成工作正常。db char(1)field1、field2在代码库中映射为布尔值。

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

    但在插入DB时,我得到

    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))

    这是试图在DB中插入false/true,但我想插入1或0。 需要帮助。

    我有用于开发人员功能测试的Derby和用于其他环境的oracle。我对两个数据库使用相同的JOOQ生成的存根(使用DerbyDB生成)。这对甲骨文来说似乎很好,但对德比来说却不是。

    http://blog.jooq.org/tag/boolean-data-type/ 声明Oracle支持,Derby不支持此转换。需要变通一下。

    1 回复  |  直到 11 年前
        1
  •  3
  •   Lukas Eder    11 年前

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

    您当前正在使用该功能 "data type rewriting" 在代码生成器配置中。这意味着jOOQ的运行时不知道数据库中的实际数据类型。它的行为就像数据类型 是 BOOLEAN 。这意味着:

    • Oracle JDBC驱动程序将转换Java boolean 将值绑定到 1 或 0 对于 NUMBER 列,或到 '1' 或 '0' 对于字符串列。
    • DerbyJDBC驱动程序不会转换此类型,而是希望 布尔型 列。

    如果要以这种方式继续,则必须将Derby列类型设置为实际 布尔型 ,不是 CHAR(1) .

    指定 Converter 在代码生成器中

    另一种选择是使用jOOQ 转换器 相反,在那里您可以翻译Java 布尔型 到Java String 第一 ,然后将值传递到数据库。这样,您可以在两个数据库中使用相同的数据类型。 This is documented here, in the manual .