【问题标题】:Is it possible to use analytic functions in Hibernate?是否可以在 Hibernate 中使用分析函数?
【发布时间】:2010-09-09 14:21:39
【问题描述】:

有没有办法在 Hibernate 中使用类似 sql-server 的分析函数?

有点像

select foo from Foo foo where f.x = max(f.x) over (partition by f.y)

【问题讨论】:

    标签: sql hibernate


    【解决方案1】:

    您正在执行本机 SQL 查询。

    如果您使用的是 JPA,则语法为:

    Query q = em.createNativeQuery("select foo.* from Foo foo " +
                                   "where f.x = max(f.x) over " +
                                   "(partition by f.y)", Foo.class);
    

    如果需要返回多个类型,看SQLResultSetMapping注解。

    如果您直接使用 Hibernate API:

    Query q = session.createSQLQuery("select {foo.*} from Foo foo " +
                                     "where f.x = max(f.x) over "+
                                     "(partition by f.y)");
    q.addEntity("foo", Foo.class);
    

    有关更多详细信息,请参阅 Hibernate 文档中的 10.4.4. Queries in native SQL

    在这两个 API 中,您都可以使用 setParameter 正常传递参数。

    【讨论】:

    • 谢谢,但这是否可以直接在 Hibernate 中完成?
    【解决方案2】:

    另一种方法是使用映射。请看这篇文章:https://forums.hibernate.org/viewtopic.php?f=1&t=998482

    我反对在 Hibernate 中使用原生 SQL 查询...你失去了拥有映射的好处:-)

    【讨论】:

      【解决方案3】:

      是的,你可以,但你需要像下面这样扩展休眠方言:

      导入 org.hibernate.dialect.Oracle10gDialect;

      public class ExtendedDialect extends Oracle10gDialect{
          public ExtendedDialect()
          {
                 super();
                 registerKeyword("over");
                 registerKeyword("partition");
          }
      }
      

      一旦这个类在你的类路径中,你需要告诉 hibernate 使用它而不是原来的方言(在这个例子中是 Oracle10gDialect)。我不确定您使用的是哪些框架,但对于 Spring,您可以使用 LocalContainerEntityManagerFactoryBean 下的以下属性:

              <property name="jpaVendorAdapter">
                  <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                      <property name="databasePlatform" value="path.to.dialect.ExtendedDialect" />
                  </bean>
              </property>
      

      那么你就可以在@Formula注解、@Where注解等hibernate特性中使用over和partition,而不会混淆hibernate。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-15
        • 2012-09-07
        • 2017-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-19
        相关资源
        最近更新 更多