Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 限制会导致Hibernate使用自定义FileMaker方言_Java_Spring_Hibernate_Jdbc_Filemaker - Fatal编程技术网

Java 限制会导致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

我正在尝试使用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 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支持人员,看看他们对此有何评论。