使用MSSQL数据库类型别名,jooq 3.7.3将它们转换为正确的Java类型,但是3.12.3将它们全部转换为Java类型Object jOOQ中的错误解决方法

例如,我有一个数据库类型别名,定义如下:

create type aml_acct from varchar(50) not null

然后在用于创建表的SQL中,我将具有这样的列定义:

create table accOUNTS (
  .   
  acct aml_acct,.
)

在3.7.3中,Jooq生成的代码是这样的:

public final TableField<Amlaccountsrecord,String> accT = 
   createField("acct",org.jooq.impl.SQLDataType.VARCHAR.length(50).nullable(false),this,"");

在3.12.3中,Jooq生成的代码是这样的:

    /**
     * @deprecated Unknown data type. Please define an explicit {@link org.jooq.Binding} to specify how this type should be handled. Deprecation can be turned off using {@literal <deprecationOnUnknownTypes/>} in your code generator configuration.
     */
    @java.lang.Deprecated
    public final TableField<Amlaccountsrecord,Object> accT = createField(DSL.name("acct"),org.jooq.impl.SQLDataType.OTHER.nullable(false),"");

但是我不知道如何制作Binding类来使其正确处理aml_acct数据库类型并像以前一样生成代码。还是有办法用ForcedType来解决这个问题?

任何想法或帮助将不胜感激...

xinsuandeluoba 回答:使用MSSQL数据库类型别名,jooq 3.7.3将它们转换为正确的Java类型,但是3.12.3将它们全部转换为Java类型Object jOOQ中的错误解决方法

jOOQ中的错误

这是jOOQ 3.12代码生成器中的一个错误(可能在以前的版本中也存在)。 jOOQ代码生成器的最新版本增加了对SQL Server中表值函数和表值参数的支持。为此,已编写了新的SYSINFORMATION_SCHEMA查询以获取元数据以用于SQL Server的代码生成。在这种情况下,SYS.ALL_COLUMNS将与SYS.TYPES列而不是USER_TYPE_ID列的SYSTEM_TYPE_ID联接。

此问题将在3.13.0和3.12.4中修复:https://github.com/jOOQ/jOOQ/issues/9551

解决方法

解决方法是使用<forcedType>配置将列的类型强制为所需的数据类型: https://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-database/codegen-database-forced-types/

例如:

<forcedType>
  <name>VARCHAR</name>
  <includeTypes>aml_acct</includeTypes>
</forcedType>

如果您有许多这样的类型,则还可以在上述配置中使用<sql>来匹配应应用此强制类型的所有列。可能如下所示:

<forcedType>
  <name>VARCHAR</name>
  <sql>
    select string_agg(o.name + '\.' + c.name,'|')
    from sys.all_objects o
    join sys.all_columns c on o.object_id = c.object_id
    join sys.types u on c.user_type_id = u.user_type_id
    join sys.types t on u.system_type_id = t.system_type_id
    where u.is_user_defined = 1
    and t.name = 'varchar'
  </sql>
</forcedType>

有关详细信息,请参见上面的文档链接。

本文链接:https://www.f2er.com/3106660.html

大家都在问