3

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

 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 中是不可能的,所以我必须改用本机查询吗?

4

1 回答 1

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这是一篇关于s 的好文章: 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

于 2012-07-04T14:12:30.057 回答