Sql QueryDsl-聚合内带有案例生成器的映射查询问题
我在构造使用聚合中的案例的查询时遇到问题 我的设置:QueryDsl 3.3.2,JPA+Hibernate 3.6.10.Final 我有两个实体(psudo代码): 这两者之间没有直接的关系,只是为了一些简单的报告,Car持有客户编号参考 第一个问题: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-缺点是我无法获得所有客户(这表明缺少一辆
正如我在不同的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());