java - 在基于方言的 Hibernate 标准 API 中使用不同的投影函数

标签 java hibernate hsqldb

我想在我使用条件 API 构建的查询中使用标准偏差投影。我可以像这样简单地做一些事情

public class StdDevProjection extends AggregateProjection {

    public StdDevProjection(String propertyName) {
        super("stddev", propertyName);
    }

    public Type[] getTypes(Criteria criteria, CriteriaQuery criteriaQuery)
    throws HibernateException {
        return new Type[] { Hibernate.DOUBLE };
   }

然后我可以将它与我的标准一起使用:

myCriteriea.setProjection(new StdDevProjection(myproperty));

一切都很好。但我的问题是我使用 HSQLDB 进行任何数据库单元测试等,而我们使用 Oracle 进行部署。 stddev 函数在 oracle 中运行良好,但在 HSQLDB 中不存在。 HSQLDB 有 stddev_pop 和 stddev_samp 。那么有没有什么办法可以根据方言使用不同的功能。

我也许可以扩展 HSQL 方言以将“stddev”注册到适当的 HSQL 函数,但我不确定如何在使用 Criteria API 构造的查询中使用 hsql 函数。

如有任何帮助,我们将不胜感激。

谢谢

最佳答案

使用方言是正确的方法(尽管我不得不说使用不同的数据库引擎进行测试和部署似乎有点不确定)。您可以执行以下操作:

  1. 扩展 HSQL 方言并使用 registerFunction() 注册适当的 stddev 实现。
  2. 重写 StdDevProjection 类中的 toSqlString() 方法并使用 Dialect 渲染函数名称。

类似于:

public String toSqlString(Criteria criteria, int loc, CriteriaQuery criteriaQuery) throws HibernateException {
  Dialect dialect = criteriaQuery.getFactory().getDialect();
  SQLFunction function = (SQLFunction) dialect.getFunctions().get(this.aggregate);
  //TODO: throw an exception if function is not registered

  //create function argument array
  List functionArgs = new ArrayList(1);
  functionArgs.add(criteriaQuery.getColumn(criteria, propertyName));

  return new StringBuffer()
    .append(function.render(functionArgs, criteriaQuery.getFactory()))
    .append(" as y").append(loc).append('_')
    .toString();
  }

关于java - 在基于方言的 Hibernate 标准 API 中使用不同的投影函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1258016/

相关文章:

Java - Spring 框架 - 状态机

java - Android setOnClickListener 一键触发两次

java - 如何将 JTextField 设置为选中组件

java - 无法创建唯一键约束

mysql - 带有日期输入参数的 hsqldb 过程

java - 使用 hibernate 在 hsqldb 中选择更新

java - 将属性放回到java中的请求中

java - Hibernate、Spring 和 HSQL : Table not Found Exception

java - Json 忽略实体中的集合

java - 如何检查模式是否由 <jdbc :embedded-database> tag 创建