Любой способ использовать пользовательскую функцию, определенную в диалекте в аннотации @Formula или @CustomTransformer - PullRequest
0 голосов
/ 01 ноября 2018

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

Спасибо заранее

1 Ответ

0 голосов
/ 01 ноября 2018

Возможно, вам лучше реализовать пользовательский тип.

См. http://docs.jboss.org/hibernate/orm/5.3/userguide/html_single/Hibernate_User_Guide.html#basic-custom-type

(Вы, вероятно, найдете учебники, которые являются лучшим ресурсом для реализации вашего собственного типа).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...