我在构建使用聚合内部案例的查询时遇到问题。
我的设置:QueryDsl 3.3.2,JPA + Hibernate 3.6.10.Final
我有两个实体(psudo代码):
Car {
private String ownerNumber;
private String color;
}
Client {
private String number;
}
这两者之间没有直接的关系,仅仅为了一些报告简单,Car持有客户编号参考。
第一个问题:
正如我在不同的SO帖子上发现的那样,我不能使用自定义属性在这个etities上使用join,我需要使用例如cross join。使用:来自客户端cl,car.c,其中cl.number = c.owner_number - 缺点是我无法获得所有客户端(这表明没有汽车) - 只有这两个道具有连接。这对我的报道来说不是太好,但是让我说我可以忍受这个。
第二个问题:
在同一个查询中,我还需要聚合一些数据 - 我需要计算所有用户的汽车,并说全红。所以我需要这样:
SELECT c.number, count(c.id) AS total, SUM(CASE WHEN c.color='RED' THEN 1 ELSE 0 END) as allRed FROM client cl, car c WHERE cl.number=c.ownerNumber GROUP BY c.number;
此查询按预期工作; 对于QueryDsl,我有:
QClient client = Qclient.client;
QCar car = Qcar.car;
NumberExpression<Integer> redCarExp = new CaseBuilder()
.when(car.color.eq("RED"))
.then(1)
.otherwise(0);
List<Tuple> list = new JPAQuery(em)
.from(client, car)
.where(client.number.eq(car.ownerNumber))
.groupBy(client.number)
.list(client.number, car.id.count(), redCarExp.sum());
运行它会生成如下所示的JPAQuery和异常。没有最后的sum()部分一切正常。我不确定这里的问题在哪里。
java.lang.ClassCastException:org.hibernate.hql.ast.tree.ParameterNode无法强制转换为org.hibernate.hql.ast.tree.SelectExpression org.hibernate.hql.ast.tree.CaseNode.getFirstThenNode(CaseNode.java:44) org.hibernate.hql.ast.tree.CaseNode.getDataType(CaseNode.java:40) org.hibernate.hql.ast.util.SessionFactoryHelper.findFunctionReturnType(SessionFactoryHelper.java:402) org.hibernate.hql.ast.tree.AggregateNode.getDataType(AggregateNode.java:82) org.hibernate.hql.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:154) org.hibernate.hql.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:857) org.hibernate.hql.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:645) org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:685) org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:301) org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:244) org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:256) org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:187) org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:138) org.hibernate.engine.query.HQLQueryPlan。(HQLQueryPlan.java:101) org.hibernate.engine.query.HQLQueryPlan。(HQLQueryPlan.java:80) org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:124) org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156) org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135) org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1770) org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:277) sun.reflect.GeneratedMethodAccessor74.invoke(未知来源) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:606) org.springframework.orm.jpa.ExtendedEntityManagerCreator $ ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:342) com.sun.proxy。$ Proxy63.createQuery(未知来源) sun.reflect.GeneratedMethodAccessor74.invoke(未知来源) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:606) org.springframework.orm.jpa.SharedEntityManagerCreator $ SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:262) com.sun.proxy。$ Proxy63.createQuery(未知来源) com.mysema.query.jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:129) com.mysema.query.jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:97) com.mysema.query.jpa.impl.AbstractJPAQuery.list(AbstractJPAQuery.java:242) com.mysema.query.jpa.impl.AbstractJPAQuery.list(AbstractJPAQuery.java:236)