I have to run a native query to retrieve the data to be inserted in a model other than the JpaRepository in which it is declared, when I execute the function loadValoriPreventivoUnicaPercumento I have the following error. How can I fix this? and what is it due to?
Error:
Errore: org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type
[org.springframework.data.jpa.repository.query .AbstractJpaQuery$TupleConverter$TupleBackedMap] to type [com.reportserver.report.model.TableReportCapitoloPreventivo]
Java Code:
public interface SottoCapitoloRepository extends JpaRepository<SottoCapitolo, Integer> {
//Permette il caricamento dei sotto capitolo
@Query("FROM SottoCapitolo where IdCapitolo=:IdCapitolo")
List<SottoCapitolo> load(@Param("IdCapitolo") int IdCapitolo);
//Caricamento valori stampa sotto capitoli report unica percentuale
@Query(nativeQuery = true, value = "DECLARE @T AS table( Descrizione varchar(5000), NumeroCapitolo varchar(100), SottoCapitolo1 varchar(5000), SottoCapitolo2 varchar(5000), SottoCapitolo3 varchar(5000), Totale money, DescrizioneEstesa varchar(5000), Images Image, CostoUnitario money, Quantita money, DescrizioneDis varchar(5000),Tipologia varchar(300),PrezzoRiservato money,UM varchar(50)); INSERT INTO @T SELECT Capitolo.Descrizione, Capitolo.NumeroCapitolo,SottoCapitolo.SottoCapitolo1,SottoCapitolo.SottoCapitolo2,SottoCapitolo.SottoCapitolo3, (ROUND(((((ROUND((((((((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) SottoCapitolo.CostoUnitario) / 100) * PercentualeUtile) (((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) SottoCapitolo.CostoUnitario)) * 1), 2)) / 100) * PercentualeMargine) (ROUND((((((((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) SottoCapitolo.CostoUnitario) / 100) * PercentualeUtile) (((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) SottoCapitolo.CostoUnitario)) * 1), 2))), 2)) * SottoCapitolo.Quantita as Totale ,SottoCapitolo.DescrizioneEstesa, SottoCapitolo.Images, ROUND(((((ROUND((((((((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) SottoCapitolo.CostoUnitario) / 100) * PercentualeUtile) (((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) SottoCapitolo.CostoUnitario)) * 1), 2)) / 100) * PercentualeMargine) (ROUND((((((((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) SottoCapitolo.CostoUnitario) / 100) * PercentualeUtile) (((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) SottoCapitolo.CostoUnitario)) * 1), 2))), 2) as CostoUnitario,SottoCapitolo.Quantita , CASE when Tipologia='Prezzo' then SottoCapitolo.Descrizione else '' SottoCapitolo.Codice ' ' SottoCapitolo.Descrizione end as DescrizioneDis,Capitolo.Tipologia,Capitolo.PrezzoRiservato,SottoCapitolo.UnitaMisura as UM FROM Capitolo INNER JOIN SottoCapitolo ON SottoCapitolo.IdCapitolo = Capitolo.IdCapitolo INNER JOIN Preventivo ON Preventivo.IdPreventivo = Capitolo.IdPreventivo where Preventivo.IdPreventivo =:IdPreventivo ;SELECT CASE WHEN ROW_NUMBER() OVER(PARTITION BY a.Descrizione ORDER BY a.Descrizione) = 1 THEN a.Descrizione ELSE '' END AS Descrizione, Descrizione as Desc2,a.NumeroCapitolo, a.SottoCapitolo1, a.SottoCapitolo2, a.SottoCapitolo3, a.DescrizioneDis, a.CostoUnitario, a.Quantita, a.Totale AS TotaleCap, a.DescrizioneEstesa, a.Images,a.Tipologia,a.PrezzoRiservato,a.UM FROM(SELECT 1 AS d, ROW_NUMBER() OVER(PARTITION BY Descrizione ORDER BY Descrizione) AS r, Descrizione, NumeroCapitolo, SottoCapitolo1, SottoCapitolo2, SottoCapitolo3, Totale, DescrizioneDis, Images, CostoUnitario, Quantita, DescrizioneEstesa,Tipologia,PrezzoRiservato,UM FROM @T UNION ALL SELECT 2, 0, Descrizione, NumeroCapitolo, '', '', '', SUM(Totale), '', '', '', '','',Tipologia,PrezzoRiservato,'' FROM @T GROUP BY Descrizione,Tipologia,PrezzoRiservato,NumeroCapitolo) AS a ORDER BY a.Descrizione, a.d ")
List<TableReportCapitoloPreventivo> loadValoriPreventivoUnicaPercentuale(@Param("IdPreventivo") int IdPreventivo);
}
public class TableReportCapitoloPreventivo implements Serializable {
public String Descrizione;
public String Desc2;
public Integer NumeroCapitolo;
public String SottoCapitolo1;
public String SottoCapitolo2;
public String SottoCapitolo3;
public String DescrizioneDis;
public Double CostoUnitario;
public Double Quantita;
public Double TotaleCap;
public String DescrizioneEstesa;
public String Tipologia;
public String UM;
public double PrezzoRiservato;
public byte[] Imgaes;
public TableReportCapitoloPreventivo(String Descrizione, String Desc2, int NumeroCapitolo, String SottoCapitolo1, String SottoCapitolo2, String SottoCapitolo3, String DescrizioneDis, double CostoUnitario, double Quantita, double TotaleCap, String DescrizioneEstesa, String tipologia, String UM, double PrezzoRiservato, byte[] Images, String Tipologia) {
this.Descrizione = Descrizione;
this.Desc2 = Desc2;
this.NumeroCapitolo = NumeroCapitolo;
this.SottoCapitolo1 = SottoCapitolo1;
this.SottoCapitolo2 = SottoCapitolo2;
this.SottoCapitolo3 = SottoCapitolo3;
this.DescrizioneDis = DescrizioneDis;
this.CostoUnitario = CostoUnitario;
this.Quantita = Quantita;
this.TotaleCap = TotaleCap;
this.DescrizioneEstesa = DescrizioneEstesa;
this.Tipologia = Tipologia;
this.UM = UM;
this.PrezzoRiservato = PrezzoRiservato;
this.Imgaes = Images;
}
}
CodePudding user response:
You have 2 options
Make
TableReportCapitoloPreventivo.class
an interface where a getter method is exposed for each field. Unfortunately the converter can not be automatically used by JPA when the returned object is represented by a class.Use
@NamedNativeQuery
with@SqlResultSetMapping
to your entity classSottoCapitolo.class
to define how the return result should be mapped into anTableReportCapitoloPreventivo.class
. If you follow this road then this previous SO answer could also guide you on how to do it.
Check another similar tutorial here.