Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MSSQL数据库类型别名,jooq 3.7.3将它们转换为正确的Java类型,但3.12.3将它们全部转换为Java类型对象_Java_Sql Server_Alias_Jooq - Fatal编程技术网

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

使用MSSQL数据库类型别名,jooq 3.7.3将它们转换为正确的Java类型,但3.12.3将它们全部转换为Java类型对象,java,sql-server,alias,jooq,Java,Sql Server,Alias,Jooq,例如,我有一个数据库类型别名,定义如下: 从varchar50创建类型aml_账户不为空 然后在创建表的SQL中,我会有如下列定义: create table ACCOUNTS ( . acct aml_acct, . ) 在3.7.3中,Jooq生成的代码如下: public final TableField<AmlAccountsRecord, String> ACCT = createField("acct", org.jooq.impl.SQLD

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

从varchar50创建类型aml_账户不为空

然后在创建表的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, "");
但我不知道如何创建一个绑定类,以使其正确处理aml_acct数据库类型并像以前一样生成代码。或者有没有办法用强制类型来处理这个问题

如果您有任何想法或帮助,我们将不胜感激。

jOOQ中的bug 这是jOOQ 3.12代码生成器中的一个bug,可能在以前的版本中也存在。最近发布的jOOQ代码生成器增加了对SQL Server中表值函数和表值参数的支持。为此,编写了新的SYS和INFORMATION_模式查询,以获取元数据以生成SQL Server代码。在这种情况下,SYS.ALL_列将连接到USER_TYPE_ID列而不是SYSTEM_TYPE_ID列上的SYS.TYPES

这将在3.13.0和3.12.4中修复:

变通办法 解决方法是使用配置将列的类型强制为所需的数据类型:

例如:

瓦尔查尔 反洗钱账户 如果有许多这样的类型,还可以在上述配置中使用,以匹配应应用此强制类型的所有列。这可能如下所示:

瓦尔查尔 选择字符串\u aggo.name+'\.'+c.name'.\124;' 从sys.all_objects o 在o.object\u id=c.object\u id上连接sys.all\u列 在c.user\u type\u id=u.user\u type\u id上连接sys.types u 在u.system\u type\u id=t.system\u type\u id上连接sys.types t 其中u.is_user_defined=1 和t.name='varchar'
有关详细信息,请参阅上面的文档链接。

感谢您的快速回复!我将提出强制打字的建议。