代码之家  ›  专栏  ›  技术社区  ›  super.t

限制会导致Hibernate的自定义FileMaker方言

  •  2
  • super.t  · 技术社区  · 6 年前

    我正在尝试使用SpringJPA2.0.9和Hibernate5.3.5访问FileMaker16数据库 the official JDBC driver this dialect 为了冬眠。

    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 到select查询的末尾。

    现在我有一个测试,在尝试从Spring JPA repo获取分页结果时失败了:

    com.filemaker.jdbc文件.FMSQLException:[FileMaker][FileMaker JDBC] com.filemaker.jdbc文件.调频_API.准备(未知来源)在 com.filemaker.jdbc文件.调频_API编制人(未知来源)在 com.filemaker.jdbc文件.调频_API编制人(未知来源)在 com.filemaker.jdbc2.commonj2语句。(未知源)位于 com.filemaker.jdbc3.CommonJ3Statement.(未知来源)位于 com.filemaker.jdbc3J3先生连接准备声明(未知来源)在 com.filemaker.jdbc2公共J2连接准备声明(未知) (来源) 网址:com.zaxxer.hikari.pool.ProxyConnection.prepareStatement准备(ProxyConnection.java:318) 在 网址:com.zaxxer.hikari.pool.hikariproxy连接.准备陈述(H)ikariProxyConnection.java文件) 在 在 org.hibernate.engine.jdbc.internal.statementPrepareImpl文件$政治家t准备模板.prepareStatement(S)tatementPrepareImpl.java:172格式) ... 87个以上

    com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:318) select * from "MarketingCategories" marketingc0_ offset ? rows fetch first ? rows only ,将问号替换为数字并使用同一驱动程序对FileMaker数据库手动执行,它将成功返回分页结果集。

    我该如何处理这个例外?我想知道如何进一步调试它。没有fmjdbc驱动程序的源代码,反编译的类也没有行号信息,所以我不能在调试器中检查它。

    1 回复  |  直到 6 年前
        1
  •  2
  •   super.t    6 年前

    here ,我做了一个变通方法:

    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;
            }
        };
    
    ...
    }
    

    它在注释中为参数绑定放置占位符,并在限制处理程序中插入分页参数。

        2
  •  0
  •   F. Sans    5 年前

    在这里查看我的johnkeates FileMaker方言补丁: https://github.com/fsans/FileMaker-Hibernate-dialect 几乎没有其他改进。