Ограничение результатов в пользовательском диалекте FileMaker для Hibernate - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь получить доступ к базе данных FileMaker 16, используя Spring JPA 2.0.9 с Hibernate 5.3.5, используя официальный драйвер 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 (неизвестный источник) на com.filemaker.jdbc.FM_API.prepareRS (неизвестный источник) на com.filemaker.jdbc.FM_API.prepareRS (неизвестный источник) на com.filemaker.jdbc1.CommonJ1State. (Неизвестный источник) на com.filemaker.jdbc2.CommonJ2Statement. (Неизвестный источник) на com.filemaker.jdbc3.CommonJ3Statement. (Неизвестный источник) на com.filemaker.jdbc3.J3PreparedStatement. (Неизвестный источник) на com.filemaker.jdcc.J3Connection.prepareStatement (Неизвестный источник) в com.filemaker.jdbc2.CommonJ2Connection.prepareStatement (Неизвестный источник) в com.zaxxer.hikari.pool.ProxyConnection.prepareStatement (ProxyConnection.java:318) в com.zaxxpool.h.HikariProxyConnection.prepareStatement (HikariProxyConnection.java) в org.hibernate.engine.jdbc.internal.StatementPreparerImpl $ 5.doPrepare (StatementPreparerImpl.java:146) в org.hibernate.enp.: 172) ... еще 87

Однакоесли я возьму SQL из com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:318), который выглядит как select * from "MarketingCategories" marketingc0_ offset ? rows fetch first ? rows only, заменим вопросительные знаки на числа и выполню его вручную для базы данных FileMaker, используя тот же драйвер, он успешно вернет разбитый на страницы набор результатов.

Какмне идти об этом исключении?Я надеялся получить ключ к дальнейшему устранению неполадок.Нет источников драйвера fm jdbc, а декомпилированный класс не имеет информации о номерах строк, поэтому я не могу проверить ее в отладчике.

1 Ответ

0 голосов
/ 18 сентября 2018

Сообщая о проблеме здесь , я сделал обходной путь:

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

...
}

Он помещает заполнители для привязки параметров в комментарии, вставляя параметры пагинации прямо в обработчик лимита.

...