在我的sql中,我还希望按计算的表达式进行分组。
我提出了一个受https://groups.google.com/forum/#!topic/querydsl/z-uIRU5jVcM启发的解决方案。
我想在结构上生成的sql看起来像这样,在那里我执行计算 - 映射 - 使用内部sql,然后加入其他一些字段并使用join进行分组:
select
col1,
...
calculatedExpressionAlias,
count(col1)
from t
left join
(
select
ro1.ID,
(
case when .. then ..
...
else
end
)
as calculatedExpressionAlias
from t
)
as s on s.ID = t.ID
group by col1,
...
calculatedExpressionAlias
这个sql应该由来自JPASQLQuery的QueryDsl生成。
它几乎看起来像这样,但剩下的问题是生成的sql中的一个奇怪的别名。我与计算的案例表达式相关联的别名(例如“calculatedExpressionAlias”)在投影{。*}
中显示大括号和星号select
...
{calculatedExpressionAlias.*},
...
left join
(
select
...
(
case when .. then ..
)
as calculatedExpressionAlias
...
group by
...
calculatedExpressionAlias
这是什么原因以及如何解决?
这是最初的JPASqlQuery,道歉它有点长:
SRoRohrnetzobjekt ro1 = new SRoRohrnetzobjekt("ro1");
SRoRohrnetzobjekt ro2 = new SRoRohrnetzobjekt("ro2");
SRoRohrnetzobjekt ro3 = new SRoRohrnetzobjekt("ro3");
SSRbstelle rb = new SSRbstelle("rb");
DateTimePath<Timestamp> naechsteInspektion = ro1.kontrollzyklusNaechsteinspektion;
NumberExpression<Integer> dringlichkeit =
Expressions
.cases()
.when(p.imIntervall(naechsteInspektion,
InspektionsDringlichkeit.ROHRNETZ_INSPEKTION_DRINGLICHKEIT_SOFORT))
.then(InspektionsDringlichkeit.ROHRNETZ_INSPEKTION_DRINGLICHKEIT_SOFORT.getStatusWert())
.when(p.imIntervall(naechsteInspektion,
InspektionsDringlichkeit.ROHRNETZ_INSPEKTION_DRINGLICHKEIT_4_WOCHEN))
.then(InspektionsDringlichkeit.ROHRNETZ_INSPEKTION_DRINGLICHKEIT_4_WOCHEN.getStatusWert())
.when(p.imIntervall(naechsteInspektion,
InspektionsDringlichkeit.ROHRNETZ_INSPEKTION_DRINGLICHKEIT_12_WOCHEN))
.then(InspektionsDringlichkeit.ROHRNETZ_INSPEKTION_DRINGLICHKEIT_12_WOCHEN.getStatusWert())
.when(p.imIntervall(naechsteInspektion,
InspektionsDringlichkeit.ROHRNETZ_INSPEKTION_KEINE_DRINGLICHKEIT))
.then(InspektionsDringlichkeit.ROHRNETZ_INSPEKTION_KEINE_DRINGLICHKEIT.getStatusWert())
.otherwise(InspektionsDringlichkeit.ROHRNETZ_INSPEKTION_KEINE_DRINGLICHKEIT.getStatusWert());
Path<Integer> d = new PathBuilder<Integer>(Integer.class, "dringlichkeit");
ListSubQuery<Tuple> sub = new SQLSubQuery()
.from(ro1)
.list(ro1.id, dringlichkeit.as(d));
return new JPASQLQuery(entityManager, new Db2SqlTemplates())
.from(ro2)
.leftJoin(rb).on(ro2.rbstelleId.eq(rb.id))
.leftJoin(sub, ro3)
.on(ro3.id.eq(ro2.id))
.groupBy(
rb.bezeichnung,
ro2.unterbezeichnung,
ro2.adresseOrtsteil,
ro2.adressePlz,
d)
.list(
new QFaelligeGruppe(
rb.bezeichnung,
ro2.unterbezeichnung,
ro2.adressePlz,
ro2.adresseOrtsteil,
d,
ro2.count()));
答案 0 :(得分:0)
解决方案是使用Expressions工厂构建别名:
Path<Integer> d = Expressions.numberPath(Integer.class, "dringlichkeit");