您的位置:首页 > 编程语言 > Java开发

使用Spring Data Jpa 遇到 数据库字段以 from 开头,分页查询失败的问题

2018-01-11 00:00 1106 查看
最近在敲代码的时候发现一个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中的类
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: