JOOQ forcedTypes为布尔值

时间:2015-09-21 05:40:11

标签: java sql jooq

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

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

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

我有Derby for Dev功能测试和oracle用于其他环境。我使用相同的JOOQ生成的存根(使用Derby DB生成)用于数据库。对于Oracle而言,这似乎工作得很好,但对Derby来说却不行。

http://blog.jooq.org/tag/boolean-data-type/表示Oracle支持,Derby不支持此转换。需要一个解决方法。

1 个答案:

答案 0 :(得分:1)

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

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

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

如果您想以这种方式进行,则必须使Derby列类型为实际BOOLEAN,而不是CHAR(1)

在代码生成器

中指定Converter

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