java - 限制 Hibernate 的自定义 FileMaker 方言中的结果
问题描述
我正在尝试使用 Spring JPA 2.0.9 和 Hibernate 5.3.5 访问 FileMaker 16 数据库,使用官方 JDBC 驱动程序和Hibernate方言。
我对方言进行了修改,以使其支持限制 FileMaker 结果集,添加如下限制处理程序:
public class FileMakerDialect extends Dialect {
...
private static final LimitHandler LIMIT_HANDLER = new AbstractLimitHandler() {
public String processSql(String sql, RowSelection selection) {
String soff = " offset ? rows";
String slim = " fetch first ? rows only";
StringBuilder sb = (new StringBuilder(sql.length() + soff.length() + slim.length())).append(sql);
if (LimitHelper.hasFirstRow(selection)) {
sb.append(soff);
}
if (LimitHelper.hasMaxRows(selection)) {
sb.append(slim);
}
return sb.toString();
}
public boolean supportsLimit() {
return true;
}
};
public LimitHandler getLimitHandler() {
return LIMIT_HANDLER;
}
...
}
限制处理程序只是添加offset ? rows fetch first ? rows only
到选择查询的末尾。
现在我有一个测试在尝试从 Spring JPA 存储库中获取分页结果时失败:
com.filemaker.jdbc.FMSQLException: [FileMaker][FileMaker JDBC] FQL0001/(1:338): 查询语法有错误。com.filemaker.jdbc.FM_API.prepare(Unknown Source) at com.filemaker.jdbc.FM_API.prepareRS(Unknown Source) at com.filemaker.jdbc.FM_API.prepareRS(Unknown Source) at com.filemaker.jdbc1.CommonJ1Statement .(Unknown Source) at com.filemaker.jdbc2.CommonJ2Statement.(Unknown Source) at com.filemaker.jdbc3.CommonJ3Statement.(Unknown Source) at com.filemaker.jdbc3.J3PreparedStatement.(Unknown Source) at com.filemaker.jdbc3 .J3Connection.prepareStatement(Unknown Source) at com.filemaker.jdbc2.CommonJ2Connection.prepareStatement(Unknown Source) at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:318) at com.zaxxer.hikari.pool。光代理连接。
但是,如果我从中获取 SQL ,将问号替换为数字并使用相同的驱动程序手动对 FileMaker 数据库执行它,它会成功返回分页结果集com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:318)
。select * from "MarketingCategories" marketingc0_ offset ? rows fetch first ? rows only
我该如何处理这个异常?我希望知道如何进一步调试它。没有 fm jdbc 驱动程序的来源,反编译的类也没有行号信息,所以我无法在调试器中检查它。
解决方案
在这里报告问题时,我做了一个解决方法:
public class FileMakerDialect extends Dialect {
...
private static final LimitHandler LIMIT_HANDLER = new AbstractLimitHandler() {
public String processSql(String sql, RowSelection selection) {
String soff = String.format(" offset %d rows /*?*/", selection.getFirstRow());
String slim = String.format(" fetch first %d rows only /*?*/", selection.getMaxRows());
StringBuilder sb = (new StringBuilder(sql.length() + soff.length() + slim.length())).append(sql);
if (LimitHelper.hasFirstRow(selection)) {
sb.append(soff);
}
if (LimitHelper.hasMaxRows(selection)) {
sb.append(slim);
}
return sb.toString();
}
public boolean supportsLimit() {
return true;
}
};
...
}
它将参数绑定的占位符放置在将分页参数插入限制处理程序的注释中。
推荐阅读
- javascript - React,写handleInputChange函数更优雅
- linux - 将命令结果输出到 txt 文件
- vue.js - Vue 无法从库中读取未定义的属性“扩展”
- python - cqlsh 和 Python cassandra 驱动程序中最大时间 uuid 的差异
- python - 有人可以解释为什么 .asp 链接会出现奇怪的行为吗?
- angularjs - AngularJS 1.4 全面升级到 Angular 8。我应该迁移到 1.5 然后升级还是重写?
- c++ - 我的函数因式分解程序存在变量问题,显示不正确的答案
- python - 如何拉伸 matplotlib 频谱图的 x 轴?
- r - valueBox 显示使用反应函数从 selectInput 中选择的列的最大值
- c# - 按下 ctrl+space 时不要触发单击焦点元素