Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql QueryDsl-聚合内带有案例生成器的映射查询问题_Sql_Hibernate_Querydsl - Fatal编程技术网

Sql QueryDsl-聚合内带有案例生成器的映射查询问题

Sql QueryDsl-聚合内带有案例生成器的映射查询问题,sql,hibernate,querydsl,Sql,Hibernate,Querydsl,我在构造使用聚合中的案例的查询时遇到问题 我的设置:QueryDsl 3.3.2,JPA+Hibernate 3.6.10.Final 我有两个实体(psudo代码): 这两者之间没有直接的关系,只是为了一些简单的报告,Car持有客户编号参考 第一个问题: 正如我在不同的SO文章中发现的那样,我不能使用自定义属性在这个etities上使用连接,我需要使用例如交叉连接。使用:来自客户cl,car.c,其中cl.number=c.owner\u number-缺点是我无法获得所有客户(这表明缺少一辆

我在构造使用聚合中的案例的查询时遇到问题

我的设置:QueryDsl 3.3.2,JPA+Hibernate 3.6.10.Final

我有两个实体(psudo代码):

这两者之间没有直接的关系,只是为了一些简单的报告,Car持有客户编号参考

第一个问题:
正如我在不同的SO文章中发现的那样,我不能使用自定义属性在这个etities上使用连接,我需要使用例如交叉连接。使用:来自客户cl,car.c,其中cl.number=c.owner\u 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());
QClient client=QClient.client;
QCar car=QCar.car;
NumberPression redCarExp=新案例生成器()
.何时(汽车颜色均衡器(“红色”))
.然后(1)
。否则(0);
列表=新的JPAQuery(em)
.来自(客户、汽车)
.where(客户编号eq(车主编号))
.groupBy(客户端号)
.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.hqlslwalker.processQuery(hqlslwalker.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.docomfile(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)

可能与此问题有关,对吧,
Expressions.numberTemplate(Long,“1”)
成功了-谢谢!有没有办法通过querydsl中的自定义道具将这两个实体连接起来?基于何处的连接是一种方法JPQL@TimoWestkämper-是否有任何方法-使用where base join或其他技术,也可以从没有连接的实体(如左连接)获取行,并指示缺少car?这在我的报告中确实是必需的,所以我需要考虑以某种方式重新设计它
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());