Я должен поддерживать Redshift и Clickhose. У меня есть два расширения диалекта:
public class RedshiftDialect extends PostgreSQL94Dialect {
public RedshiftDialect() {
super();
registerFunction("to_date",
new SQLFunctionTemplate(
StandardBasicTypes.DATE,
"to_date(to_char(?1, 'YYYY-MM-DD'), 'YYYY-MM-DD')"));
}
}
public class ClickHouseDialect extends Dialect {
private static final LimitHandler LIMIT_HANDLER =
new AbstractLimitHandler() {
@Override
public String processSql(String sql, RowSelection selection) {
final boolean hasOffset = LimitHelper.hasFirstRow(selection);
return sql + (hasOffset ? " limit ? offset ?" : " limit ?");
}
@Override
public boolean supportsLimit() {
return true;
}
@Override
public boolean bindLimitParametersInReverseOrder() {
return true;
}
};
public ClickHouseDialect() {
super();
registerColumnType(Types.VARCHAR, "Nullable(String)");
registerColumnType(Types.BIGINT, "Nullable(Int64)");
registerColumnType(Types.DATE, "Nullable(Date)");
registerColumnType(Types.TIMESTAMP, "Nullable(DateTime)");
registerColumnType(Types.FLOAT, "Nullable(Float64)");
registerFunction("to_date",
new StandardSQLFunction(
"toDate",
StandardBasicTypes.DATE));
}
@Override
public LimitHandler getLimitHandler() {
return LIMIT_HANDLER;
}
}
public class RedshiftDialect extends PostgreSQL94Dialect {
public RedshiftDialect() {
super();
registerFunction("to_date",
new SQLFunctionTemplate(
StandardBasicTypes.DATE,
"to_date(to_char(?1, 'YYYY-MM-DD'), 'YYYY-MM-DD')"));
}
}
Вот мое отображение сущностей:
@Immutable
@Entity(name = "ReportEntry")
@Table(name = "reporting")
public class ReportEntry implements Serializable {
...
@Dimension
@Formula("to_date(date)")
@Column(nullable = false)
private Instant date;
...
}
Я бы хотел, чтобы всякий раз, когда я упоминал атрибут date в моем hql, вычисляемое выражение to_date (date) зависело от текущего диалекта, но, к сожалению, аннотация @Formula принимает только собственное выражение sql. Любые идеи, как использовать пользовательские функции с формулой?
Спасибо заранее