hibernate 将数据JPA从接口发送到impl,以返回DTO的列表

bwitn5fc  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(118)

我有一个查询,它在带有注解@Query的接口中工作得很好,如下所示。

@Query(value = "SELECT  c.fecha, c.clave"
        + " FROM mavi.contrarecibo c "
        + " WHERE p.idproveedor = :idProveedor "
        + " AND c.fecha BETWEEN :inicio AND :termino "
        + " AND cf.estatusfactura = :estatusfactura"
        + " ORDER BY c.clave"
        ,
        nativeQuery = true
        )
List<ContrareciboPagoDto> pagosByProveedor(
        @Param("idProveedor")Long idProveedor,
        @Param("inicio")LocalDate inicio,
        @Param("termino")LocalDate termino,
        @Param("estatusfactura")String estatusContrareciboFacturaEnum
        );

这很好,现在为了使这个查询更灵活,我想添加一些条件限制,为此,我创建了这个接口的impl并尝试了以下操作。
//只有方法。

@Override
public List<ContrareciboPagoDto> pagosByProveedor(Long idProveedor, LocalDate inicio, LocalDate termino,
        String estatusContrareciboFacturaEnum) {
    
    StringBuilder qry = new StringBuilder("SELECT  c.fecha, c.clave, p.razonsocial, p.rfc, cf.numeroFactura, cf.monto, cf.fechaPago, oc.moneda, "
            + " pt.clabe, pt.cuentacontable, cf.uuid, p.diascredito, oc.descdepartamento, oc.observaciones, cf.estatusFactura "
            + " FROM mavi.contrarecibo c "
            + " JOIN mavi.contrarecibo_factura cf on cf.idcontrarecibo = c.idcontrarecibo "
            + " JOIN mavi.proveedor_tesoreria pt on pt.idproveedortesoreria = c.idproveedor "
            + " JOIN mavi.proveedor p on p.idproveedor = pt.idproveedor "
            + " JOIN mavi.orden_compra oc on oc.folio = cf.ordencompra "
            
            );
    
    if( idProveedor > 0) {
        qry.append(  " WHERE p.idproveedor = ").append(idProveedor);
    }

    // SOME OTHER RESTRICTIONS.
    
    return this.entityManager
                .createNativeQuery( qry.toString() , ContrareciboPagoDto.class)
                .getResultList();
}

相反,它只是一个接口。

public interface ContrareciboPagoDto {
    

    public LocalDate getFechaRevision();

    public String getNumeroContraRecibo() ;

问题是我得到了一个错误。
org.springframework.orm.jpa.JpaSystemException:未知实体:com.mavi.compras.service.dto.ContrareciboPagoDto;嵌套异常为org.hibernate.MappingException:未知实体:com.mavi.compras.service.dto.ContrareciboPagoDto
如何实现此查询以使其更通用?
谢谢大家。

ruarlubt

ruarlubt1#

您不能将DTO类与createNativeQuery()一起使用,因为它期望接收一个用@Entity注解的类。为了获得DTO,您可以使用例如。变压器:

@Override
public List<ContrareciboPagoDto> pagosByProveedor(Long idProveedor, LocalDate inicio, LocalDate termino,
        String estatusContrareciboFacturaEnum) {
    
    StringBuilder qry = new StringBuilder("SELECT  c.fecha, c.clave, p.razonsocial, p.rfc, cf.numeroFactura, cf.monto, cf.fechaPago, oc.moneda, "
            + " pt.clabe, pt.cuentacontable, cf.uuid, p.diascredito, oc.descdepartamento, oc.observaciones, cf.estatusFactura "
            + " FROM mavi.contrarecibo c "
            + " JOIN mavi.contrarecibo_factura cf on cf.idcontrarecibo = c.idcontrarecibo "
            + " JOIN mavi.proveedor_tesoreria pt on pt.idproveedortesoreria = c.idproveedor "
            + " JOIN mavi.proveedor p on p.idproveedor = pt.idproveedor "
            + " JOIN mavi.orden_compra oc on oc.folio = cf.ordencompra "
            
            );
    
    if( idProveedor > 0) {
        qry.append(  " WHERE p.idproveedor = ").append(idProveedor);
    }

    // SOME OTHER RESTRICTIONS.
    
    return this.entityManager
                .createNativeQuery(qry.toString())
                .setResultTransformer(Transformers.aliasToBean(ContrareciboPagoDto.class))
                .getResultList();
}

看看这个答案:https://stackoverflow.com/a/45934668/12473843

相关问题