使用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中的类

相关文章
相关标签/搜索