java - 使用MSSQL数据库类型别名,jooq 3.7.3将它们转换为正确的Java类型,但3.12.3将它们全部转换为java类型Object

标签 java sql-server alias jooq

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

从 varchar(50) not null 创建类型 aml_acct

然后在创建表的 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), this, "");

但我不知道如何创建一个 Binding 类以使其正确处理 aml_acct 数据库类型并像以前一样生成代码。或者有没有办法用 ForcedType 来处理这个问题?

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

最佳答案

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>

有关详细信息,请参阅上述文档链接。

关于java - 使用MSSQL数据库类型别名,jooq 3.7.3将它们转换为正确的Java类型,但3.12.3将它们全部转换为java类型Object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58845922/

相关文章:

java - 如何访问传递的通用数组列表中的元素

sql-server - 比较日期 < 或 DateDiff 哪个更好?

java - 如何将独立的 Scala 应用程序转换为可运行的 SOA?

java - IZPACK exe 包装器 + 7ZIP 安装错误 - 捆绑 java 安装程序

java - "AWT-EventQueue-0"java.lang.ArrayIndexOutOfBoundsException : 3

mysql - 错误代码: 1248. Every derived table must have its own alias 找不到查询的解决方案

sql - MySQL:可能在 AS 别名中有通配符?

sql-server - 在单个查询中将多个节点插入到 xml 字段

sql - 获取最近的非空记录

svn - SVN 中是否有像 CVS 中那样的 'alias' 功能?