Spring Boot应用对接新SQL Server数据库执行查询报错问题咨询
问题根因
抛出的SQLGrammarException属于SQL执行语法错误,代码、应用配置均无问题,仅目标库存在异常,原因均出在目标数据库侧或环境配置侧:
- 目标库排序规则为大小写敏感:SQL Server默认使用不区分大小写的排序规则,若目标库排序规则包含
CS标识(如Chinese_PRC_CS_AS),实体类注解中声明的表名EIDPAT、列名UserPin等和目标库实际表/字段的大小写不匹配,就会导致Hibernate生成的SQL执行时找不到对应对象,抛出语法错误。 - 连接账号默认Schema不匹配:代码中未显式指定表的Schema,旧库、开发环境库中
EIDPAT表归属的Schema与连接账号的默认Schema一致(通常为dbo),但目标库中该表归属了其他Schema,导致查询时找不到表。 - 环境JNDI数据源配置错误:虽然应用配置的JNDI名称为
java:jboss/jdbc/PAT/pat_ds,但目标部署环境的JBoss中该JNDI实际绑定的数据库实例有误,指向的库中不存在EIDPAT表。 - 连接账号表权限不足:目标库中应用使用的连接账号没有
EIDPAT表的查询权限,SQL Server会返回类语法错误提示,被Hibernate包装为当前抛出的异常。
无代码修改解决方案
所有调整均在数据库侧或部署环境侧执行,无需改动应用代码:
- 调整目标库排序规则:将目标库的排序规则修改为和旧库/开发库一致的不区分大小写规则(如
Chinese_PRC_CI_AS,CI标识代表不区分大小写),也可单独调整EIDPAT表及关联字段的排序规则,保证和Hibernate生成的SQL中的表、列名称大小写匹配即可。 - 修正连接账号默认Schema:先查询目标库中
EIDPAT表实际归属的Schema,再将应用连接账号的默认Schema设置为对应值,例如表归属dbo时执行SQL:ALTER USER [应用连接账号名称] WITH DEFAULT_SCHEMA = dbo。 - 校验环境JNDI配置:登录目标环境的JBoss管理后台,检查
java:jboss/jdbc/PAT/pat_ds数据源的连接地址、库名配置,确保指向正确的目标迁移库,且库中存在EIDPAT表。 - 授予账号对应表权限:给应用连接账号开放
EIDPAT表的查询权限,执行SQL:GRANT SELECT ON EIDPAT TO [应用连接账号名称]。
排查小贴士:你应用配置中已开启
hibernate.show_sql=true,可直接提取Hibernate打印的原生SQL,用应用连接账号登录目标数据库执行,即可快速定位具体问题点。
内容的提问来源于stack exchange,提问作者subham
相关产品推荐
相关产品推荐

