最近在敲代码的时候发现一个jpa问题,在此记录,用作备忘。
背景:
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中的类