到目前为止,我选择了这样的实体:
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中是不可能的,所以我是否必须使用本机查询?
答案 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