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.