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 に答える