JPAは初めてです。だから私の質問は、ある人にとってはとても簡単なはずです。
以下は、JPAに変換したいSQLの単純なクエリです。 TimeEnt
というエンティティクラスが既にあります。
SELECT
SUM(TimeEntryActualHours) as UnBilledHrs,
SUM (TimeEntryAmount) as UnbilledAmount
FROM TimeEnt WHERE MatterID = 200
JPAクエリ言語は、AVG、COUNT、MAX、MIN、SUMなどのSELECT句で集約関数をサポートし、SELECT句で複数select_expressionsをサポートします。この場合、結果はList
配列のObject
(Object[]
)。 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);
}
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();
EJB Query Language 仕様をご覧ください。
イディオムは標準SQLに非常に似ています
EntityManager em = ...
Query q = em.createQuery ("SELECT AVG(x.price) FROM Magazine x");
Number result = (Number) q.getSingleResult ();
よろしく、