使用MSSQL数据库类型别名,jooq 3.7.3将它们转换为正确的Java类型,但3.12.3将它们全部转换为Java类型对象
例如,我有一个数据库类型别名,定义如下: 从varchar50创建类型aml_账户不为空 然后在创建表的SQL中,我会有如下列定义:使用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
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'
有关详细信息,请参阅上面的文档链接。感谢您的快速回复!我将提出强制打字的建议。