JRJpaDataSource

Saudações,

Estou procurando por exemplos, tutoriais, guias, qualquer material que me ajude a usar [color=red]JRJpaDataSource da API do JasperReports[/color]. Fiz uma boa busca e so encontrei exemplos onde se usa JRJpaDataSource para passar o EntityManager para o Jasper como um parâmetro e no template se faz a query e preenche o relatório.

O que quero é que toda a lógica de criação seja feita pela aplicação, ou seja todo o datasource, da Query via JPA ao Banco, passando pela criação do JRDataSource que seria passado ao relatório para o preenchar através do método JasperFillManager.fillReport(JasperReport, Map, JRDataSource).

Agradeço demais a ajuda isto está empacando a minha tarefa a dias.

Estou a disposição para qualquer perguntas. [alessandro.moreira@gmail.com]

Um abraço a todos.

Não encontrei exemplo de uso do JRJpaDataSource, onde este fornece um datasource ao relatório. Resalto que o que encontrei foi exemplo que forneciam a conexão ao banco via EntityManager.

Mas bem, estou postando a solução que implementei. Dentro da API do JasperReports não encontrei solução senão fazer uma especialização.

Criei uma especialização do JRDataSource. Veja o código abaixo.

    public class JRArrayDataSource implements JRDataSource {

        private Iterator<Object[]> iterator;
        private Object[] cursor;
        private int indice;

        public JRArrayDataSource(List<Object[]> array) {
            super();
            iterator = array.iterator();
        }

        public Object getFieldValue(JRField jrField) throws JRException {
            indice++;
            if (indice < cursor.length) {
                return cursor[indice];
            }
            return null;
        }

        public boolean next() throws JRException {
            boolean retorno = iterator.hasNext();
            if (retorno) {
                cursor = iterator.next();
                indice = -1;
            }
            return retorno;
        }
    }

O que faço aki é iterar a Lista e depois passar ir lendo o array e retornando o valor.
O importante é observar a sequencia dos campos no relatório. A ordem de criação deve bater com a ordem dos elementos no array, aí o mapeamente é feito sem problemas.

Veja o código da geração do relatório abaixo:

    public static void gerarRelatorio() throws JRException {
        List<Object[]> array = new ArrayList<Object[]>();
        array.add(new Object[]{new Integer(1), "Alessandro Moreira", "Caldeirão Furado, 13", "32321010"});
        array.add(new Object[]{new Integer(2), "Wolverine", "Escola Xavier, X", "55551234"});
       
        JRArrayDataSource arrayDataSource = new JRArrayDataSource(array);
       
        JasperPrint print = JasperFillManager.fillReport("relatorio/relatorioCliente.jasper", new HashMap<Object, Object>(), arrayDataSource);


        JasperViewer view = new JasperViewer(print);
        view.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        view.setSize(500, 600);

        view.setLocationRelativeTo(null);
        view.setVisible(true);
    }

Espero que seja útil e bom Java para todos.