使用Spring Data Jpa 遇到 数据库字段以 from 开头,分页查询失败的问题
2018-01-11 00:00
1106 查看
最近在敲代码的时候发现一个jpa问题,在此记录,用作备忘。
背景:
springboot 1.5.9 + sql server 2008 r2
数据库表中的一个字段以from开头。例如 from_xxx
问题:
报错 SQL Error: 102, SQLState: S0001 “.”附近有语法错误。
解决方式:
创建包
将hibernate中的类 SQLServer2005LimitHandler 复制出来。修改一下
修改为:
解决步骤与思路:
1. 分析报错前,打印的sql 。发现是生成 SQL中,存在 from开头字段位置发生错误
2.经过分析,发现是因为 字段from开头引起问题。 from
3.经过跟踪,发现是hibernate-core中的文件 SQLServer2005LimitHandler.class 中的 文本内容替换引起的。
4. 该问题在 Hibernate-core 项目中, 21 Dec 2016 进行了修复。版本为5.2.7
https://github.com/hibernate/hibernate-orm/commit/56f7466d52b49456bbf0178f7666d320de4812e1#diff-c1a924d918fa582db7bbd4853e4d6fa8
5. 但是如果升级版本,会引起版本不兼容问题(JPA调用问题)。
6.自己写类,覆盖掉 hibernate-core中的类
背景:
springboot 1.5.9 + sql server 2008 r2
数据库表中的一个字段以from开头。例如 from_xxx
问题:
报错 SQL Error: 102, SQLState: S0001 “.”附近有语法错误。
解决方式:
创建包
package org.hibernate.dialect.pagination;
将hibernate中的类 SQLServer2005LimitHandler 复制出来。修改一下
private static Pattern buildShallowIndexPattern(String pattern, boolean wordBoundardy) { return Pattern.compile( "(" + ( wordBoundardy ? "\\b" : "" ) + pattern + ")(?![^\\(]*\\))", Pattern.CASE_INSENSITIVE ); }
修改为:
private static Pattern buildShallowIndexPattern(String pattern, boolean wordBoundardy) { return Pattern.compile( "(" + ( wordBoundardy ? "\\b" : "" ) + pattern + ( wordBoundardy ? "\\b" : "" ) + ")(?![^\\(|\\[]*(\\)|\\]))", Pattern.CASE_INSENSITIVE ); }
解决步骤与思路:
1. 分析报错前,打印的sql 。发现是生成 SQL中,存在 from开头字段位置发生错误
2.经过分析,发现是因为 字段from开头引起问题。 from
3.经过跟踪,发现是hibernate-core中的文件 SQLServer2005LimitHandler.class 中的 文本内容替换引起的。
private static final Pattern FROM_PATTERN = buildShallowIndexPattern( FROM, true );
private static Pattern buildShallowIndexPattern(String pattern, boolean wordBoundardy) { return Pattern.compile( "(" + ( wordBoundardy ? "\\b" : "" ) + pattern + ")(?![^\\(]*\\))", Pattern.CASE_INSENSITIVE ); }
4. 该问题在 Hibernate-core 项目中, 21 Dec 2016 进行了修复。版本为5.2.7
https://github.com/hibernate/hibernate-orm/commit/56f7466d52b49456bbf0178f7666d320de4812e1#diff-c1a924d918fa582db7bbd4853e4d6fa8
5. 但是如果升级版本,会引起版本不兼容问题(JPA调用问题)。
6.自己写类,覆盖掉 hibernate-core中的类
相关文章推荐
- 在Spring Boot中使用Spring-data-jpa实现分页查询
- 在Spring Boot中使用Spring-data-jpa实现分页查询
- 在Spring Boot中使用Spring-data-jpa实现分页查询
- 在Spring Boot中使用Spring-data-jpa实现分页查询
- 在Spring Boot中使用Spring-data-jpa实现分页查询
- 在Spring Boot中使用Spring-data-jpa实现分页查询
- 源码解析,浅谈spring-data-jpa 中莫名的查询字段不存在问题
- 在Spring Boot中使用Spring-data-jpa实现分页查询
- 在Spring Boot中使用Spring-data-jpa实现分页查询
- 在Spring Boot中使用Spring-data-jpa实现分页查询
- 在Spring Boot中使用Spring-data-jpa实现分页查询
- 在Spring Boot中使用Spring-data-jpa实现分页查询(转)
- 在Spring Boot中使用Spring-data-jpa实现分页查询
- 在Spring Boot中使用Spring-data-jpa实现分页查询
- SpringBoot第二讲利用Spring Data JPA实现数据库的访问(二)_分页和JpaSpecificationExecutor接口介绍
- SpringBoot第二讲 利用Spring Data JPA实现数据库的访问(二)_分页和JpaSpecificationExecutor接口介绍
- • Spring Boot 进 阶- 数 据 访 问-使用spring-data-jpa 操作数据库
- SpringData JPA查询分页demo
- JPA 分页查询 (Spring Data Jpa 5)
- spring data jpa 实体类中字段不与数据库表映射 ORA-00904 标识符无效