3

投影 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))))

DBでpronosticoテーブルが空の場合、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);       
4

2 に答える 2

3

これも誰かに役立つかもしれません。集計合計操作を実行している場合、代わりに null 値を 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 が生成されます。

于 2013-01-02T13:31:49.633 に答える