到目前为止,我选择了这样的实体:
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/