Passar resultado da consulta no Hibernate para iReport
7 respostas
brunodila
Olá pessoal!
Estou tentando passar os valores retornados de uma consulta no Hibernate para um relatório no iReport.
Mas apresenta o seguite erro:
Código:
publicvoidimprimirTodosAlunos(){try{HashMapmap=newHashMap();Alunoa=newAluno();Sessionsessao=HibernateUtility.getSession();Queryselect=sessao.getNamedQuery("todosAlunos");Listobjetos=select.list();Iteratoritem=objetos.iterator();map.put("Aluno",a);sessao.close();JRDataSourcejds=newJRBeanCollectionDataSource(objetos);Filefile=newFile("C:\\Documents and Settings\\Bruno\\Desktop\\SMS\\src\\Relatorio\\rlAluno.jasper");JasperViewerviewer=newJasperViewer(JasperFillManager.fillReportToFile(file.getAbsolutePath(),map,jds),true);viewer.setVisible(true);}catch(Exceptione){e.printStackTrace();}}
Ele não conseguiu pegar os dados desse cara aí, dá uma revisada na sua query, no seu HashMap você está tentando passar um novo aluno? Ele só vai carregar os registros do banco, não precisa desse new Aluno(). da uma estudada nisso que te falei e se não funionar posta a exceção de novo.
brunodila
Olá!
Fiz as alterações abaixo mas o erro continua...
publicvoidimprimirTodosAlunos(){try{HashMapmap=newHashMap();Sessionsessao=HibernateUtility.getSession();Queryselect=sessao.getNamedQuery("todosAlunos");Listobjetos=select.list();Iteratoritem=objetos.iterator();map.put("Aluno",item);sessao.close();JRDataSourcejds=newJRBeanCollectionDataSource(objetos);Filefile=newFile("C:\\Documents and Settings\\Bruno\\Desktop\\SMS\\src\\Relatorio\\rlAluno.jasper");JasperViewerviewer=newJasperViewer(JasperFillManager.fillReportToFile(file.getAbsolutePath(),map,jds),true);viewer.setVisible(true);}catch(Exceptione){e.printStackTrace();}}
fnandos
Oi Brunodila, cara embaixo eu tenho um exemplo que eu implementei de teste, mas foi com JDBC em uma aplicação WEB, num Servlet, A query que aparece é a mesma que está no relatório, o map eu passei vazio, por que não tinha nenhum outro parâmetro, é interessante no caso do seu relatório ser Mestre-detalhe senão passa ele como vazio, seta o caminho como você fez. nesse caso eu mandei gerar direto em pdf. No seu caso, não precisaria do Iterator se não for mestre-detalhe, vc ta utilizando namedQuery, tente com SQLQuery, e uma query nativa, certifique-se de ser a mesma do relatório. Acho que deve dar certo, mas depende do que o seu relatorio exige.
Class.forName(driver);Connectioncon=DriverManager.getConnection(url,login,pwd);Statementstm=con.createStatement();Stringquery="select * from biblioteca";ResultSetrs=stm.executeQuery(query);//implementação da interface JRDataSource para DataSource ResultSetJRResultSetDataSourcejrRS=newJRResultSetDataSource(rs);//executa o relatórioMappar=newHashMap();par.put(" "," ");StringjasperFile=getServletContext().getRealPath("/WEB-INF/report/")+"/";Stringpath=getServletContext().getRealPath("/");/* Preenche o relatório com os dados. Gera o arquivo BibliotecaPessoal.jrprint */try{// Aqui ele cria o relatórioJasperPrintimpressao=JasperFillManager.fillReport(jasperFile+"classic.jasper",par,con);// Grava o relatório em disco em pdfJasperManager.printReportToPdfFile(impressao,path+"/RelatorioLivros.pdf");// Redireciona para o pdf geradoresponse.sendRedirect("RelatorioLivros.pdf");
brunodila
Olá!
Eu fiz mexi no relatório e no código, mas agora está dando outro erro.
publicvoidimprimirTodosAlunos(){try{HashMapmap=newHashMap();Sessionsessao=HibernateUtility.getSession();Queryselect=sessao.getNamedQuery("todosAlunos");Listobjetos=select.list();map.put("","");sessao.close();JRBeanArrayDataSourcejrdts=newJRBeanArrayDataSource(objetos.toArray());Filefile=newFile("C:\\Documents and Settings\\Bruno\\Desktop\\SMS\\src\\Relatorio\\rlAluno.jasper");JasperPrintprint=JasperFillManager.fillReport(getClass().getResourceAsStream(file.getAbsolutePath()),newHashMap(),jrdts);JasperViewer.viewReport("C:\\Documents and Settings\\Bruno\\Desktop\\SMS\\src\\Relatorio\\rlAluno.jasper",false,false);}catch(Exceptione){e.printStackTrace();}}
fnandos
JRBeanArrayDataSource jrdts = new JRBeanArrayDataSource(objetos.toArray());
Por vc está passando sua lista para array?
Tem um erro na linha 54 dessa classe ou nas próximas a ela, na classe PesquisaAluno tem um erro na linha 23 ou nas próximas a ela.
Como vc está fazendo a chamada desse método? Pelo que entendi é numa aplicação swing e ele é chamado através de um botão btnImprimir certo?
brunodila
Certo,
estou chamando na tela de Pesquisa aluno através do botão imprimir.
Primeiramente eu declarei a classe
private ControleAluno ca;
Depois estou chamando o método no botão imprimir:
ca.imprimirTodosAlunos();
fnandos
Certo, não precisaria passar a list para array, o erro parece ser nesse método mesmo, dá uma revisada nessa parte.