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;
}
}
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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP