奇怪的QueryDsl {别名。*}

时间:2015-07-30 15:38:55

标签: querydsl

在我的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()));

1 个答案:

答案 0 :(得分:0)

解决方案是使用Expressions工厂构建别名:

Path<Integer> d = Expressions.numberPath(Integer.class, "dringlichkeit");