Java 限制会导致Hibernate使用自定义FileMaker方言
我正在尝试使用SpringJPA2.0.9和Hibernate5.3.5访问FileMaker16数据库,并使用and for Hibernate 我对方言进行了修改,以使其支持限制FileMaker结果集,并添加了如下限制处理程序:Java 限制会导致Hibernate使用自定义FileMaker方言,java,spring,hibernate,jdbc,filemaker,Java,Spring,Hibernate,Jdbc,Filemaker,我正在尝试使用SpringJPA2.0.9和Hibernate5.3.5访问FileMaker16数据库,并使用and for Hibernate 我对方言进行了修改,以使其支持限制FileMaker结果集,并添加了如下限制处理程序: public class FileMakerDialect extends Dialect { ... private static final LimitHandler LIMIT_HANDLER = new AbstractLimitHandler
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?行先取?仅行
到select查询的末尾
现在,我有一个测试,当尝试从SpringJPA repo获取分页结果时失败:
com.filemaker.jdbc.FMSQLException:[filemaker][filemaker jdbc]
FQL0001/(1:338):查询语法中存在错误。在
com.filemaker.jdbc.FM_API.prepare(未知源代码)位于
com.filemaker.jdbc.FM_API.prepareRS(未知来源)位于
com.filemaker.jdbc.FM_API.prepareRS(未知来源)位于
com.filemaker.jdbc1.commonj1语句。(未知源)位于
com.filemaker.jdbc2.CommonJ2Statement.(未知源代码)位于
com.filemaker.jdbc3.CommonJ3Statement.(未知源)位于
jdbc3.J3PreparedStatement.(未知源)位于
com.filemaker.jdbc3.J3Connection.prepareStatement(未知源)位于
com.filemaker.jdbc2.CommonJ2Connection.prepareStatement(未知
来源)在
com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:318)
在
com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java)
在
org.hibernate.engine.jdbc.internal.statementPrepareImpl$5.doPrepare(statementPrepareImpl.java:146)
在
org.hibernate.engine.jdbc.internal.StatementPrepareImpl$StatementPreparationTemplate.prepareStatement(statementPrepareImpl.java:172)
... 87多
但是,如果我从com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:318)
获取SQL,它看起来像select*from“MarketingCategories”marketingc0\uu偏移?行先取?仅行
,将问号替换为数字,并使用同一驱动程序对FileMaker数据库手动执行,它将成功返回分页结果集
我如何处理这个例外?我希望得到进一步调试的线索。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;
}
};
...
}
它将参数绑定的占位符放在注释中,将分页参数插入到限制处理程序中。此处查看我在johnkeates FileMaker方言上的修补程序:没有其他改进。看起来像是FileMaker JDBC解析
prepareStatement
中的命令文本时出现的错误。如果您可以使用普通的JDBC创建一个应用程序,那么将其发送给FileMaker支持人员,看看他们对此有何评论。