奇怪的 QueryDsl {别名。*}
Strange QueryDsl {alias.*}
在我的 sql 中,我还想按计算出的表达式进行分组。
我想出了一个受 https://groups.google.com/forum/#!topic/querydsl/z-uIRU5jVcM 启发的解决方案。
我想生成的 sql 在结构上看起来像这样,我在其中执行计算 - 映射 - 使用内部 sql,然后加入其他一些字段并使用加入:
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 应该由 QueryDsl 从 JPASQLQuery 生成。
看起来差不多是这样,但剩下的问题是生成的 sql 中有一个奇怪的别名。我与计算出的 case 表达式相关联的别名(例如 "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()));
解决方案是使用表达式工厂构造别名:
Path<Integer> d = Expressions.numberPath(Integer.class, "dringlichkeit");
在我的 sql 中,我还想按计算出的表达式进行分组。
我想出了一个受 https://groups.google.com/forum/#!topic/querydsl/z-uIRU5jVcM 启发的解决方案。
我想生成的 sql 在结构上看起来像这样,我在其中执行计算 - 映射 - 使用内部 sql,然后加入其他一些字段并使用加入:
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 应该由 QueryDsl 从 JPASQLQuery 生成。
看起来差不多是这样,但剩下的问题是生成的 sql 中有一个奇怪的别名。我与计算出的 case 表达式相关联的别名(例如 "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()));
解决方案是使用表达式工厂构造别名:
Path<Integer> d = Expressions.numberPath(Integer.class, "dringlichkeit");