web-dev-qa-db-ja.com

JPAの2つの列でSUMなどの集計関数を実行し、結果を表示する方法は?

JPAは初めてです。だから私の質問は、ある人にとってはとても簡単なはずです。

以下は、JPAに変換したいSQLの単純なクエリです。 TimeEntというエンティティクラスが既にあります。

SELECT 
     SUM(TimeEntryActualHours) as UnBilledHrs,
     SUM (TimeEntryAmount) as UnbilledAmount
FROM TimeEnt WHERE MatterID = 200
27
BinCode

JPAクエリ言語は、AVG、COUNT、MAX、MIN、SUMなどのSELECT句で集約関数をサポートし、SELECT句で複数select_expressionsをサポートします。この場合、結果はList配列のObjectObject[])。 JPA仕様から:

4.8.1 SELECT句の結果タイプ

...

SELECT句の結果タイプは、それに含まれるselect_expressionsの結果タイプによって定義されます。 SELECT句で複数のselect_expressionsが使用されている場合、クエリの結果はObject[]、およびこの結果の要素は、SELECT句での指定の順序と型で、各select_expressionsの結果型に対応します。

つまり、コメントで言及した種類のクエリ(およびエンティティを提供しなかったので、例に基づいて回答を作成します)がサポートされていますが、問題はありません。コードサンプルを次に示します。

String qlString = "SELECT AVG(x.price), SUM(x.stocks) FROM Magazine x WHERE ...";
Query q = em.createQuery(qlString);
Object[] results = (Object[]) q.getSingleResult();

for (Object object : results) {
    System.out.println(object);
}

参照資料

  • JPA 1.0仕様
    • 4.8.1 SELECT句の結果タイプ
    • 4.8.4 SELECT句の集計関数
41
Pascal Thivent

Productというエンティティがあるとしましょう:

final Query sumQuery = entityManager
                    .createQuery("SELECT SUM(p.price), SUM(p.sale) FROM Product p WHERE p.item=:ITEM AND ....");
sumQuery.setParameter("ITEM","t1");

final Object result= sumQuery.getSingleResult(); // Return an array Object with 2 elements, 1st is sum(price) and 2nd is sum(sale).

//If you have multiple rows;
final Query sumQuery = entityManager
                .createQuery("SELECT SUM(p.price), SUM(p.sale) FROM Product p WHERE p.item in (" + itemlist
                        + ") AND ....");
// Return a list of arrays, where each array correspond to 1 item (row) in resultset.
final List<IEniqDBEntity> sumEntityList = sumQuery.getResultList(); 
9
Binu S

EJB Query Language 仕様をご覧ください。

イディオムは標準SQLに非常に似ています

EntityManager em = ...
Query q = em.createQuery ("SELECT AVG(x.price) FROM Magazine x");
Number result = (Number) q.getSingleResult ();

よろしく、

3
Jose Diaz