任何方式使用@Formula或@CustomTransformer注释中的方言中定义的自定义函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了任何方式使用@Formula或@CustomTransformer注释中的方言中定义的自定义函数相关的知识,希望对你有一定的参考价值。

我必须支持Redshift和Clickhouse。我有两个方言扩展:

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

我希望每当我在我的hql中提到date属性时,评估的to_date(date)表达式取决于当前的方言,但不幸的是@Formula annotation只接受本机sql表达式。任何想法如何使用自定义函数与公式?

预先感谢

答案

您可能更好地实现自定义类型。

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

(您可能会发现教程是实现自己类型的更好资源)。

以上是关于任何方式使用@Formula或@CustomTransformer注释中的方言中定义的自定义函数的主要内容,如果未能解决你的问题,请参考以下文章

Citardauq Formula无法正常工作

使用 Hibernate @Formula 查找时差

「BZOJ 4451」「CERC 2015」Frightful Formula

使用 Hibernate 加入 @Formula

如何使用 statsmodels.formula.api (python) 预测新值

python使用matplotlib可视化线图(line plot)可视化函数曲线并在标题title中显示函数的公式formula(add function formula into title)