【问题标题】:How to set null values in result projection to zero with QueryDSL如何使用 QueryDSL 将结果投影中的空值设置为零
【发布时间】:2012-11-10 05:42:51
【问题描述】:

我想知道如何在投影 pronostico2.nropack.sum() 中设置 null 值...

new HibernateSubQuery().from(pronostico)
                             .where(pronostico.aeropuerto.eq(vuelo.aeropuertoDestino)
                             .and(pronostico.fechareg.before(fechaHoraSimulacion)))
                             .unique(pronostico.nropack.sum()).loe(aeropuerto.cappack.subtract(vuelo.numpack))))

当 pronostico 表在 DB 中为空时,pronostico.nropack.sum() 中返回的值为 null,但我希望为零。我尝试像这样合并: pronostico.nropack.sum().coalesce(0)

.. 但我没有得到任何答案。相反,我得到一个 Cast Exception: Cannot convert Long to Integer...

有人有答案吗?

PD:完整的查询是:

    QVuelo vuelo = QVuelo.vuelo;
    QAvion avion = QAvion.avion;
    QTipoAvion tipoAvion = QTipoAvion.tipoAvion;
    QAeropuerto aeropuerto = QAeropuerto.aeropuerto;
    QPronostico pronostico = QPronostico.pronostico;
    QPronostico pronostico2 = new QPronostico("pronostico2");

    List<Vuelo> vuelos = consulta.from(vuelo)
                            .innerJoin(vuelo.avion, avion)
                            .innerJoin(avion.tipoAvion, tipoAvion)
                            .innerJoin(vuelo.aeropuertoDestino, aeropuerto)
                            .where(vuelo.aeropuertoOrigen.idaeropuerto.eq(idAeropuertoActual)
                                    .and(vuelo.salidaest.after(fechaHoraSimulacion))
                                    .and((vuelo.numpack.add(nroPaquetes).loe(tipoAvion.cappack)))
                                    .and(new HibernateSubQuery().from(pronostico)
                                            .where(pronostico.aeropuerto.eq(vuelo.aeropuertoDestino)
                                                    .and(pronostico.fechareg.before(fechaHoraSimulacion)))
                                            .unique(pronostico.nropack.sum()).loe(aeropuerto.cappack.subtract(vuelo.numpack))))
                            .list(vuelo);       

【问题讨论】:

标签: java sql hibernate querydsl


【解决方案1】:

这也可能对某人有用。当您执行聚合求和运算时,您可能希望将空值视为 0。如果您想要正确的排序、null 和 0 以不同的方式排序,这主要是有用的。

QMyEntity myEntity = QMyEntity.myEntity;

from(myEntity).list(new QMyProjectionClass(
  (NumberExpression<Double>) myEntity.minutes.coalesce(0d).asNumber().sum()
));

这会产生原生 SQL(在本例中为 Oracle):

sum(nvl(myentity1_.minutes, 0))

实体:

@Entity
public class MyEntity {

  ...
  private Double minutes;

  public Double getMinutes() {
    return minutes;
  }

}

投影类:

public class MyProjectionClass {

  private Double totalMinutes;

  @QueryProjection
  public MyProjectionClass(Double totalMinutes) {
    this.totalMinutes = totalMinutes;
  }
}

注意:运行 maven-apt-plugin 会生成 Querydsl 元模型类 QMyEntity 和 QMyprojectionClass。

【讨论】:

    【解决方案2】:

    试试这个: pronostico.nropack.sum().coalesce(BigDecimal.ZERO)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-05
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多