奇怪的 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");