Spring与Hibernate升级后,如何配置Hibernate查询列名大小写不敏感
问题解决:Hibernate 6中HQL属性名大小写敏感配置
问题原因
升级到Hibernate 6后,HQL解析器默认严格匹配实体属性名的大小写。你的查询中使用mycolumn(全小写),但实体类的属性是myColumn(驼峰格式),Hibernate 6无法识别该属性名,因此抛出SemanticException。而Hibernate 5的解析器对属性名大小写不敏感,所以之前能正常运行。
解决方案
通过Hibernate配置开启HQL属性名大小写不敏感:
1. 在Spring Boot配置文件中添加参数
application.properties:
spring.jpa.properties.hibernate.query.hql.property-name-case-insensitive=true
application.yml:
spring: jpa: properties: hibernate: query: hql: property-name-case-insensitive: true
2. 原理说明
该配置会让Hibernate在解析HQL时忽略属性名的大小写差异,无论是mycolumn、MYCOLUMN还是myColumn,都能正确匹配到实体类的myColumn属性。
备选方案(不推荐)
如果不想修改配置,也可以将查询语句改为原生SQL(使用createNativeQuery),直接引用数据库列名MYCOLUMN:
@Override @Transactional(readOnly = true) public List<Long> findIdsByQuery(String query) { NativeQuery<Long> nativeQuery = em.createNativeQuery("select IDX from MyEntities where " + query, Long.class); return nativeQuery.getResultList(); }
但这种方式会失去HQL的面向对象特性,直接耦合数据库列名,不建议长期使用。
内容的提问来源于stack exchange,提问作者Michael G
相关产品推荐
相关产品推荐

