最近在敲代码的时候发现一个jpa问题,在此记录,用做备忘。git
背景:github
springboot 1.5.9 + sql server 2008 r2 spring
数据库表中的一个字段以from开头。例如 from_xxx sql
问题:数据库
报错 SQL Error: 102, SQLState: S0001 “.”附近有语法错误。springboot
解决方式:ui
建立包hibernate
package org.hibernate.dialect.pagination;
将hibernate中的类 SQLServer2005LimitHandler 复制出来。修改一下orm
private static Pattern buildShallowIndexPattern(String pattern, boolean wordBoundardy) { return Pattern.compile( "(" + ( wordBoundardy ? "\\b" : "" ) + pattern + ")(?![^\\(]*\\))", Pattern.CASE_INSENSITIVE ); }
修改成:server
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中的类