0

次のようなクエリがあります。

select name, trunc( date, 'MM' ), sum( number )
from t$mytable
group by name, trunc( date, 'MM' );

これは完全に実行され、期待される結果が得られます。JPA 基準 API でまったく同じクエリを実装しました。

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery( pClass );
Metamodel metamodel = em.getMetamodel();
EntityType entityType_ = metamodel.entity( pClass );
Root<?> root = criteriaQuery.from( pClass );

Expression pathName = root.get( entityType_.getSingularAttribute( "name" ));
Path pathDate = root.get( entityType_.getSingularAttribute( "date" ) );
Expression<Date> pathTruncatedDate = criteriaBuilder.function("trunc", Date.class , pathDate, 'MM');
Expression pathNumber = criteriaBuilder.sum( root.get( entityType_.getSingularAttribute("number") ));

criteriaQuery.select( criteriaBuilder.array( pathName,  pathTruncatedDate, pathNumber) );

List<Expression> groupBy = new ArrayList<Expression>();
groupBy.add( pathName);
groupBy.add( pathTruncatedDate);
criteriaQuery.groupBy( groupBy );
TypedQuery<Object[]> q = em.createQuery( criteriaQuery );

<-- そして驚くべきことに、実行すると ORA-00979: not a GROUP BY expression が発生しました。何が問題を引き起こしたのか、すべてが正しい場所にあると思います。事前にどうもありがとうございました!

4

2 に答える 2

0

私は同じ問題を抱えており、この ORA-00979 の根本原因を発見しました。

Oracleは、以下のクエリで日付の集計を自動的に処理します

select name, trunc( date, 'MM' ), sum( number )
from t$mytable
group by name, trunc( date, 'MM' );

leastCriteria API では、Criteria Builderメソッドを使用する必要があります。

あなたのケースでは、選択行を次のように置き換えるだけです:

criteriaQuery.select( criteriaBuilder.array( pathName,  criteriaBuilder.least(pathTruncatedDate), pathNumber) );
于 2014-10-24T12:42:44.227 に答える