Preencher Relatórios JasperReport com Hibernate

2 respostas
J

Ola pessoal,
Estou com problemas para gerar relatórios na minha aplicação.

Utilizo Hibernate com Annotations, JasperReport

Tenho a Classe Cliente

@Entity
public class Cliente implements java.io.Serializable {
    @Id
    private Integer codigo;
    @Column(nullable = false)
    private String nome;
    @ManyToOne()
    private Cidade cidade;

   //Getters e Setters

}

Busco uma List no banco;

envio para o JRBeanCollectionDataSource(cliente);

o problema é que o Jasper não encontra os atributos da classe Cidade que esta associada a classe Cliente

java.lang.NoSuchMethodException:Unknown property 'nome_cidade'.

Já pesquisei em varios lugares uma forma de preencher relatórios com o Hibernate, todas as que encontrei não resolveram o problema, então tentei buscar um objeto Connection para gerar um ResultSet e enviar como parametro para o metodo JasperFillManager.fillReport(), porem o objeto Connection retornado pelo Hibernate vem nulo.

private Connection getConnection() {
        try {
            return HibernateUtility.getSession().disconnect();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

ou

private Connection getConnection() {
        try {
            return HibernateUtility.getSession().close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }
2008-02-22 12:40:41,750 WARN  engine.query.JRJdbcQueryExecuter  -> The supplied java.sql.Connection object is null.

Se alguem souber como buscar um Connection valido, ou saiba alguma outra forma de preencher relatórios, será bem vinda!

Valew t+

2 Respostas

R
Cara, eu utilizo da seguinte forma com Hibernate:
try {
    // Um List com os registros que vêm do DAO
    List<ClasseDoObjeto> dataSource = ClasseDoObjetoDAO.getObjetos();

    // Um HashMap com os parâmetros
    HashMap params = new HashMap();

    // Exibicao do Relatorio
    JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(dataSource);
    JasperReport report = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResource("relatorio/nome_do_rel.jasper"));

    JasperPrint impressao = JasperFillManager.fillReport(report, params, ds);

    JRViewer viewer = new JRViewer(impressao);

    JInternalFrame frameViewer = new JInternalFrame("Relatorio");
    frameViewer.setSize(800, 600);
    frameViewer.setMaximizable(true);
    frameViewer.setClosable(true);
    frameViewer.setResizable(true);
    frameViewer.add(viewer);

    FrmPrincipal.dpPrincipal.add(frameViewer);
    frameViewer.setVisible(true);
    frameViewer.setMaximum(true);

} catch (Exception e) {
    Log.registraErro("Problema ao gerar Relatorio.\n" + e.getMessage());
}

Mas para que funcione, o relatório deve ter sido configurado corretamente lá no iReport.
Verifique se está.

Qualquer coisa, tenho um método também para obter um Connection do Hibernate que utilizo às vezes, mas essa forma não é recomendada.

Falow

D

Cara, até sei que gostam desse negócio de Collection, mas vai ai a dica. Usa os mapeamentos em XML, sem Annotation. Faz tudo no iReport e depois de compilado em .jasper, passa os parâmetros via Hibernate Annotation.

PS: Antes que reclamem, usem um Hibernate Tools da vida pra fazer esses “malditos” XMLs.

Abraços

Criado 22 de fevereiro de 2008
Ultima resposta 22 de fev. de 2008
Respostas 2
Participantes 3