Я пытаюсь получить доступ к базе данных 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, а декомпилированный класс не имеет информации о номерах строк, поэтому я не могу проверить ее в отладчике.