QueryDsl - 在聚合中使用案例构建器映射查询的问题

时间:2014-04-11 09:43:46

标签: sql hibernate querydsl

我在构建使用聚合内部案例的查询时遇到问题。

我的设置: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)

0 个答案:

没有答案