使用Spring Data Jpa 遇到 數據庫字段以 from 開頭,分頁查詢失敗的問題

 

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

相關文章
相關標籤/搜索