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 表达式。是什么引起了这个问题,我猜一切都在正确的地方。非常感谢您提前!

4

2 回答 2

0

我有同样的问题,并找到了这个 ORA-00979 的根本原因。

Oracle 自动处理以下查询中的日期聚合

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

使用 Criteria API,您需要使用标准构建器least方法。

在您的案例中,您只需将选择行替换为:

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

它看起来不像 Oracle 问题,但是,
如何通过语句创建视图并在应用程序中使用视图?
就像是

create view vw_my_table as
select name, trunc( date, 'MM' ), sum( number )
from t$mytable
group by name, trunc( date, 'MM' );
于 2013-11-11T15:56:18.500 回答