SQL Server执行Hibernate查询报错,MySQL正常问题求助
Hibernate连接SQL Server时JDBC类型映射错误的解决方案
问题场景
- 执行以下Hibernate原生SQL查询:
String userIdQueryString = "select distinct user_id from l_catalog_user_object_access where REPORT_HEADER_ID in (" + " select REPORT_HEADER_ID from l_report_header_data " + " where report_types_id in (select REPORT_TYPES_ID from l_report_types where display_value like '%Report') )" + " and user_id = :userId";
- 连接MySQL时查询正常执行,但连接SQL Server时抛出错误:
org.hibernate.MappingException: No Dialect mapping for JDBC type: -9
- 当前SQL Server方言配置:
hibernate.connection.driver_class=com.microsoft.sqlserver.jdbc.SQLServerDriver hibernate.dialect=org.hibernate.dialect.SQLServerDialect
- MySQL方言配置(正常运行):
hibernate.connection.driver_class=com.mysql.jdbc.Driver hibernate.dialect=org.hibernate.dialect.MySQLDialect
解决方案及建议
1. 更换适配SQL Server版本的方言
org.hibernate.dialect.SQLServerDialect是针对旧版SQL Server(2000/2005)的方言,若使用SQL Server 2008及以上版本,需替换为对应版本的方言:
- SQL Server 2008:
org.hibernate.dialect.SQLServer2008Dialect - SQL Server 2012+:
org.hibernate.dialect.SQLServer2012Dialect - Hibernate 5.4+:可直接使用更新后的
org.hibernate.dialect.SQLServerDialect
修改配置示例:
hibernate.dialect=org.hibernate.dialect.SQLServer2008Dialect
2. 显式指定查询返回类型
在执行查询时,通过addScalar强制指定user_id的Hibernate类型,避免自动推断出错:
Query query = session.createSQLQuery(userIdQueryString) .addScalar("user_id", StandardBasicTypes.LONG) // 根据实际字段类型调整,如STRING/INTEGER .setParameter("userId", userId); List<Long> result = query.list();
注:需匹配SQL Server中user_id的实际数据类型,例如字段为NVARCHAR则使用StandardBasicTypes.STRING。
3. 统一字段数据类型映射
检查SQL Server与MySQL中user_id的字段类型差异:
- 若SQL Server中为
NVARCHAR,而旧方言无法正确映射其对应的JDBC类型-9,可在查询中显式转换类型:
select distinct CAST(user_id AS VARCHAR(50)) as user_id from l_catalog_user_object_access ...
4. 升级依赖版本
旧版Hibernate或SQL Server JDBC驱动可能存在类型映射bug,建议升级:
- Hibernate:优先使用5.4.x及以上稳定版
- SQL Server JDBC驱动:更换为
com.microsoft.sqlserver:mssql-jdbc最新稳定版
内容的提问来源于stack exchange,提问作者purush
相关产品推荐
相关产品推荐

