最近在敲代碼的時候發現一個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中的類