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

时间:2012-07-04 14:09:12

标签: 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中是不可能的,所以我是否必须使用本机查询?

1 个答案:

答案 0 :(得分:4)

使用您想要的成员创建一个附加类。在此示例中,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