hibernate - 使用 2 个实体和带有 group by 的聚合函数时,如何处理 JPA 中的类型查询?

标签 hibernate jpa hql jpa-2.0 jpql

到目前为止,我选择了这样的实体:

 public List<Customer> findAll()
 {
     TypedQuery<Customer> query = getEntityManager().createNamedQuery(Customer.FindAll, Customer.class);

     return query.getResultList();
 }

这有效。通过从结果集中调用这些实体的方法,我什至可以从“连接”表中获取数据,因此我永远不需要在 JPQL 中进行“真正的”连接。 (这就是 JPA 的意义所在)。

现在我想获取给定时间段(假设从 2011 年 1 月到 2012 年 6 月)内营业额的客户列表。原生查询将如下所示:

select cus_customer_code, cus_last_name, sum(trn_total_turnover_euro) 
from customer, transaction 
where t2c_cus_id = cus_id 
and date_part('month', trn_date) between 1 and 6 
and date_part('year', trn_date) between 2011 and 2012
group by cus_customer_code, cus_last_name;

此查询在数据库中有效。但是我如何在 JPQL 中执行此操作以及该语句的结果是什么,一对 2 个实体的列表或类似的东西?或者这在 JPQL 中不可能以这种方式实现,所以我必须使用 native 查询吗?

最佳答案

用您想要的成员创建一个额外的类(class)。在此示例中,org.test.MyClass

public MyClass {
    private String message;
    private Int time;

    public MyClass ( String msg, Int time ) { ... }

    // get / set
}

然后使用

List<MyClass> list = em.createQuery("SELECT NEW org.test.MyClass( 'Foo', 123 ) FROM IrcEvent ev", MyClass.class).getResultList();

或者,对于标量值:

List<Object[]> list = em.createQuery("SELECT 'Foo', 123 FROM IrcEvent ev", Object[].class).getResultList();

Hibernate 直到最近才正确实现标量: https://hibernate.onjira.com/browse/HHH-6591
https://hibernate.onjira.com/browse/HHH-6695

这是一篇关于 SELECT 的一般文章: http://www.objectdb.com/java/jpa/query/jpql/select

Hibernate 手册对此进行了非常简短的介绍:http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#queryhql-select

关于hibernate - 使用 2 个实体和带有 group by 的聚合函数时,如何处理 JPA 中的类型查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11330726/

相关文章:

java - org.postgresql.util.PSQLException : ERROR: syntax error on or near "session_user"

java - hibernate如何在session.save(object)上获取新插入的记录主键

java - 如何在 Spring Data JPA 或 hibernate 中存储实体

jpa - 是否在一种方法中调用 persist()、flush() 和 refresh() 以正确的方式持久化实体?

保存对象/Hibernate 时出现 java.lang.NullPointerException

java - Hibernate 示例查询

mysql - JPA - 没有名为 {{NAME_HERE}} 的 EntityManager 的持久性提供程序

java - JPA 以及与持久性提供程序和数据库供应商的兼容性

java - 多对多关联中按 <集合元素的属性> 排序

mysql - hibernate 前 N 行 HQL 查询