TransWikia.com

Consulta SQL con Hibernate Criteria

Stack Overflow en español Asked by user75463 on December 4, 2021

Estoy realizando reportes con Hibernate pero me ocurrio un problema y no encuentro forma de relizarlo.
La consulta es esta:

SELECT
  mes as mes,
  COUNT(mes) AS t_mes,
  SUM(total) AS totales,
  SUM(cantidad) AS cantidad,
  SUM(facturado) AS facturado,
  SUM(descuentos) AS descuentos
FROM(
  SELECT
    MONTH(p.fechaP) AS mes,
    SUM(p.montoP) AS total,
    COUNT(p.montoP) AS cantidad,
    SUM(f.montoF) AS facturado,
    SUM(f.descuentoF) AS descuentos
  FROM
    pagos p
  INNER JOIN
    factura f ON p.idFactura = f.idFactura
  WHERE
    f.estadoF = 'Pagado'
  GROUP BY
    p.fechaP
)
GROUP BY
  mes

El fomato que uso:

    public List ListarPagoPTotal() {
        Criteria l = getSession().createCriteria(Pagos.class, "pagos")
                .createAlias("pagos.factura", "factura")
                .add(Restrictions.eq("factura.estadoF", "Pagado"))
                .setProjection(Projections.projectionList()
                        .add(Projections.groupProperty("usuario"))
                        .add(Projections.count("montoP").as("contador"))
                        .add(Projections.sum("montoP").as("suma"))
                        .add(Projections.sum("factura.montoF").as("facturados"))
                        .add(Projections.sum("factura.descuentoF").as("descuentos")));
        return l.list();
    }

Solo puedo conseguir la primera consulta, pero para la siguiente,
o en esta parte

select * from(select * from primero)segundo order by id

¿alguna idea de como continuar?

DB

Script

@Entity
@Table(name = "pagos",
         catalog = "facturacion"
)
public class Pagos implements java.io.Serializable {

    private Integer idPagos;
    private Detalle detalle;
    private Factura factura;
    private Date fechaP;
    private BigDecimal montoP;
    private String usuario;

    public Pagos() {
    }

    public Pagos(Detalle detalle, Factura factura) {
        this.detalle = detalle;
        this.factura = factura;
    }

    public Pagos(Detalle detalle, Factura factura, Date fechaP, BigDecimal montoP, String usuario) {
        this.detalle = detalle;
        this.factura = factura;
        this.fechaP = fechaP;
        this.montoP = montoP;
        this.usuario = usuario;
    }

    @Id
    @GeneratedValue(strategy = IDENTITY)

    @Column(name = "idPagos", unique = true, nullable = false)
    public Integer getIdPagos() {
        return this.idPagos;
    }

    public void setIdPagos(Integer idPagos) {
        this.idPagos = idPagos;
    }

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "idCliente", nullable = false)
    public Detalle getDetalle() {
        return this.detalle;
    }

    public void setDetalle(Detalle detalle) {
        this.detalle = detalle;
    }

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "idFactura", nullable = false)
    public Factura getFactura() {
        return this.factura;
    }

    public void setFactura(Factura factura) {
        this.factura = factura;
    }

    @Temporal(TemporalType.DATE)
    @Column(name = "fechaP", length = 10)
    public Date getFechaP() {
        return this.fechaP;
    }

    public void setFechaP(Date fechaP) {
        this.fechaP = fechaP;
    }

    @Column(name = "montoP", precision = 8)
    public BigDecimal getMontoP() {
        return this.montoP;
    }

    public void setMontoP(BigDecimal montoP) {
        this.montoP = montoP;
    }

    @Column(name = "usuario", length = 15)
    public String getUsuario() {
        return this.usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

}

One Answer

Tu problema es que estás usando la interfaz Criteria.

Esta librería está pensada para resolver consultas pensadas como objetos, y no pensadas como SQL.

Para resolver este tipo de consulta deberías utilizar la interfaz Query, y escribir la consulta en lenguaje HQL de la siguiente manera:

public List ListarPagoPTotal() {
    Query query =getSession().createQuery("SELECT
      mes as mes,
      COUNT(mes) AS t_mes,
      SUM(total) AS totales,
      SUM(cantidad) AS cantidad,
      SUM(facturado) AS facturado,
      SUM(descuentos) AS descuentos
    FROM(
      SELECT
        MONTH(p.fechaP) AS mes,
        SUM(p.montoP) AS total,
        COUNT(p.montoP) AS cantidad,
        SUM(f.montoF) AS facturado,
        SUM(f.descuentoF) AS descuentos
      FROM
        pagos p
      INNER JOIN
        factura f ON p.idFactura = f.idFactura
      WHERE
        f.estadoF = 'Pagado'
      GROUP BY
        p.fechaP
    )
    GROUP BY
      mes")

    return query.list();
}

Nota: el nombre de los campos en la consulta HQL deben ser el mismo que los declarados en la clase java, sería de utilidad que publiques las clases modelos sobre las que estás intentando hacer la consulta.

Answered by Santi92 on December 4, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP