【发布时间】:2021-04-02 00:13:55
【问题描述】:
我们目前正在升级到 Hibernate 5.4.29。
我们有一些自定义用户类型,例如将 bigint 映射到自定义用户类型(扩展用户类型)。
metadata.applyBasicType(new MyUserType(), new String[] { MyUserType.class.getName()});
如果我使用新版本创建本机查询,例如
hibernate.createNativeQuery(select * from tablexy);
其中一列包含 bigint 值,它尝试将类型映射到自定义 Usertype MyUserType。
这似乎发生在 JdbcResultMetadata 类中
//Get the contributed Hibernate Type first
Set<String> hibernateTypeNames = factory.getMetamodel()
.getTypeConfiguration()
.getJdbcToHibernateTypeContributionMap()
.get( columnType );
//If the user has not supplied any JDBC Type to Hibernate Type mapping, use the Dialect-based mapping
if ( hibernateTypeNames != null && !hibernateTypeNames.isEmpty() ) {
if ( hibernateTypeNames.size() > 1 ) {
throw new HibernateException(
String.format(
"There are multiple Hibernate types: [%s] registered for the [%d] JDBC type code",
String.join( ", ", hibernateTypeNames ),
columnType
) );
}
else {
hibernateTypeName = hibernateTypeNames.iterator().next();
}
}
else {
hibernateTypeName = factory.getDialect().getHibernateTypeName(
columnType,
length,
precision,
scale
);
}
return factory.getTypeResolver().heuristicType(
hibernateTypeName
);
如果我们使用原生查询而不添加标量,我们会得到:
org.hibernate.HibernateException: There are multiple Hibernate types: [MyUserType1, MyUserType2] registered for the [-5] JDBC type code
如果我为每一列添加 addScalar() 可以防止这种情况。这很麻烦。除非我们明确添加,否则旧的休眠版本不会映射到用户类型,例如一个 ResultTransformer。
如果我们不想映射到用户类型,我们是否必须为每一列添加 addScalar,或者是否有其他方法可以防止这种情况发生。 (基本上我想要一个本机查询,其中结果不映射到用户类型,而不为每一列添加 addScalar)
【问题讨论】: