【问题标题】:Hibernate 5.4.29 -> native Query needs Scalar?Hibernate 5.4.29 -> 本机查询需要标量?
【发布时间】: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)

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    您可以创建自定义org.hibernate.boot.spi.MetadataContributororg.hibernate.integrator.spi.Integrator(通过服务加载器机制注册它)并通过更改映射metadataCollector.getBootstrapContext().getTypeConfiguration().getJdbcToHibernateTypeContributionMap()sessionFactory.getMetamodel().getTypeConfiguration().getJdbcToHibernateTypeContributionMap() 来删除您不想要的类型映射

    我实际上认为这可能是一个错误,但我完全不确定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 2011-06-19
      • 2017-04-14
      • 2016-02-06
      • 1970-01-01
      • 2012-06-30
      • 2017-12-22
      相关资源
      最近更新 更多