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

问题描述 投票:0回答:1

我必须支持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表达式。任何想法如何使用自定义函数与公式?

预先感谢

java hibernate jpa
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.