有没有办法在Hibernate中使用像sql-server一样的分析函数?

就像是

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

===============>>#1 票数:7

您是在本机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);

10.4.4。 有关详细信息,请参阅Hibernate文档中的本机SQL查询

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

===============>>#2 票数:4

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

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

===============>>#3 票数:3

是的,你可以,但你需要扩展hibernate方言,如下所示:

import 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。

  ask by ncgz translate from so

未解决问题?本站智能推荐:

1回复

在Hibernate中使用IF构造

我在HSQL中使用构造“if”: 现在我想用HQL重构这段代码。 我怎样才能做到这一点? 谢谢。
2回复

如何在JPA / Hibernate中使用聚合函数调用SQL查询

是否可以在以下JPA / Hibernate中运行这样的查询? 要么 这在Oracle DB中有效,但是当我使用JPA / Hibernate时,我得到了: 我问是因为我需要基于一个表“ Violations”中的数据实现一些简单的统计信息 以下是我的想法:
5回复

如何在hibernate中使用listagg

我试图使用listagg函数生成用户列表。 请考虑下表 在SQL Developer中使用以下查询 将导致控制台输出中的以下内容 我的目标是尝试在休眠中执行此操作,但我不确定如何继续。 任何帮助表示赞赏。
3回复

如何在Hibernate中使用setParameter

我要搜索具有存储在serialNumberList的相应ID的所有员工,并将其所有时间加在一起。 serialNumberList是一个字符串,其中包含用逗号分隔的ID。 发生的事情是,它无法添加serialNumberList指示的所有员工的所有小时数。 这是我的代码片段。 谢谢。
1回复

如何使用Hibernate / JDBC删除函数?

我正在尝试运行此查询 我想通过createSQLQuery()或doWork()在Hibernate会话中运行它。 像这样: 要么 这就是我得到的: 这是否意味着我不能通过JDBC / Hibernate删除函数? 此外,如果有人知道我可以运行它的方式,我
3回复

是否必须在hibernate中的createSqlQuery()中使用addScalar()? 为什么我们需要在执行SQL查询时指定要休眠的数据类型?

我知道addScalar()用于声明所选项的数据类型hibernate,在这种情况下为bandId。 但我的问题是,为什么我们需要指定要休眠的类型? 它内部执行什么? 其次,如果我们不添加addScalar(),它是一个例外吗? 最后,有没有其他方法可以实现这一目标?
2回复

使用注释在Hibernate中使用复合主键

我有一个表,该表使用两列来表示其主键,一个事务ID和一个序列号。 我尝试了第2.2.3.2.2节中推荐的http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping ,
3回复

在休眠标准中使用sum()

如何将sql查询select sum(amount * direction) from transactions写入hibernate条件?
1回复

在Hibernate中的NamedQuery中使用用户定义的变量

我的任务是加载类别(按名称加载)和子类别中的所有产品。 使用MySQL之后,我创建了SQL查询: 您可以在类别名称中提及“工具”。 效果很好,但是如果您有任何建议-非常欢迎。 在我的项目中,我正在使用Hibernate(命名查询)。 问题出在变量@pv上。 现在,它没有被编译,
1回复

如何在Hibernate HQL中使用CONCAT_WS()

要将多个列合并为一个, 我找到了一个答案 此查询在SQL中工作正常,但在HQL中却给我错误: 错误是。 (java.lang.IllegalStateException:节点的数据类型:org.hibernate.hql.internal.ast.tree.MethodNode