Проблема
В настоящее время мой собственный диалект генерирует запросы со следующим (неправильным) синтаксисом:
Код: Выделить всё
SELECT
...
FROM
...
WHERE
...
ORDER BY
...
OFFSET ... ROWS FETCH FIRST ... ROWS ONLY
Код: Выделить всё
SELECT
...
FROM
...
WHERE
...
ORDER BY
...
LIMIT ...
OFFSET ...
Вот пользовательский ImpalaDialect, который я создал на данный момент:
Код: Выделить всё
package br.tc.tcesc.sigma.apisigma.config;
import org.hibernate.dialect.Dialect;
import org.hibernate.dialect.pagination.LimitHandler;
import org.hibernate.query.spi.Limit;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class ImpalaDialect extends Dialect {
public ImpalaDialect() {
super();
// Additional configurations, if necessary.
}
@Override
public LimitHandler getLimitHandler() {
return new LimitHandler() {
@Override
public String processSql(String sql, Limit limit) {
StringBuilder modifiedSql = new StringBuilder(sql);
// Add LIMIT
if (limit.getMaxRows() != null) {
modifiedSql.append(" limit ").append(limit.getMaxRows());
}
// Add OFFSET
if (limit.getFirstRow() != null) {
modifiedSql.append(" offset ").append(limit.getFirstRow());
}
return modifiedSql.toString();
}
@Override
public boolean supportsLimit() {
return true;
}
@Override
public boolean supportsOffset() {
return true;
}
@Override
public boolean supportsLimitOffset() {
return true;
}
@Override
public void setMaxRows(Limit limit, PreparedStatement statement) throws SQLException {
// We don't configure maxRows directly; we use LIMIT in the SQL.
}
@Override
public int bindLimitParametersAtEndOfQuery(Limit limit, PreparedStatement statement, int index) throws SQLException {
// We don't use parameters at the end of the query.
return index;
}
@Override
public int bindLimitParametersAtStartOfQuery(Limit limit, PreparedStatement statement, int index) throws SQLException {
// We don't use parameters at the start of the query.
return index;
}
};
}
}
Чего мне не хватает в моей реализации, чтобы гарантировать, что Hibernate генерирует правильный синтаксис SQL с помощью LIMIT ... OFFSET ... вместо OFFSET ... ROWS FETCH FIRST ... ROWS ONLY?
Любая помощь или рекомендации по правильной настройке мы будем очень признательны за специальный диалект Импалы.
Подробнее здесь: https://stackoverflow.com/questions/792 ... -impala-hi