Erro ao chamar relatório

Bom dia galera.

Estou fazendo um relatório usando iReport usando o Hibernate e Eclipse como IDE.

Meu problema está em:

1º - Se eu faço a conexão com o Banco no relatório, faço o sql passando um valor inteiro para o minha id, ele gera o relatório normalmente, mas eu precisaria trazer do Java 2 listas e o Id da solicitação como parâmetros este id tem q substituir o valor inteiro que mencionei;

2º - Como eu faço para enviar os objetos prontos do Java e manipulá-los no iReport?

Procurei algo na Internet e achei isso:

public void gerarRelatorio() {
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        ServletContext context = (ServletContext) externalContext.getContext();
        String arquivo = context.getRealPath("relatorios/relatorio.jasper");
        JRDataSource jrds = new JRBeanCollectionDataSource(listarCidades());
        
        gerarRelatorioWeb(jrds, null, arquivo);
    }
 
    private void gerarRelatorioWeb(JRDataSource jrds, Map<Object, Object> parametros, String arquivo) {
        ServletOutputStream servletOutputStream = null;
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
 
        try {
            servletOutputStream = response.getOutputStream();
            JasperRunManager.runReportToPdfStream(new FileInputStream(new File(arquivo)), response.getOutputStream(), parametros, jrds);
            response.setContentType("application/pdf");
            servletOutputStream.flush();
            servletOutputStream.close();
            context.renderResponse();
            context.responseComplete();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    private List<Cidade> listarCidades() {
    	int id = (Integer)JsfHelper.getSessionAttribute( "idSolGer" );
		TsSolGer solGer = (TsSolGer) new BaseDao().getObject( new TsSolGer(), id );
    	this.listaCidades = new TsRotaPadDao().getListaCidades( solGer.getIdViagem().getRota().getIdRotaPad() );
        Cidade cidade = new Cidade();
        
        TsSolGer solicitacao = new TsVeiculoDao().carregarSolicitacao(id);
        	
        for (int i = 0; i < listaCidades.size(); i++) {
			cidade = listaCidades.get(i);
			if (cidade.getNome().equals(solicitacao.getVeiculo().getCidade().getNome())
					&& cidade.getNome().equals(solicitacao.getVeiculo().getCidadeAux().getNome())){
				listaCidades.remove(i);
			}
		}
        
        return listaCidades;
    }
	
	private List<TsEntrega> listarEntregas() {
		int id = (Integer)JsfHelper.getSessionAttribute( "idSolGer" );
		TsSolGer solGer = (TsSolGer) new BaseDao().getObject( new TsSolGer(), id );
		this.entregas = new TsEntregaDao().getRotById( solGer.getIdViagem().getIdViagem() );
		
		return entregas;
	}

Vejam que existem 2 métodos abaixo que geram listas, estas 2 listas são as q eu preciso enviar para o Relatório.
No JSP eu estou chamando assim:

<h:commandButton action="#{detalhes.gerarRelatorio}" value="Relatório" onclick="this.form.target='_blank'" />

Estou com o relatório parado, alguém poderia me dar uma ajuda?

Desde já agradeço.
Cordialmente
Diego Silva

Não sei se entendi bem sua explicação, mas se for oq eu entendi, vc não passa um MAP para o seu gerarRelatorioWeb:

gerarRelatorioWeb(jrds, null, arquivo);

Vc está passando null.

O uso do map é para facilitar você passar valores do seu objeto para o seu relatório.

Exemplo:

Map parametros = new HashMap();
parametros.put("nomeDoSeuParametroNoRelatorio", nomeDoSeuAtributo); 
gerarRelatorioWeb(jrds, parametros, arquivo); 

Caso for isso que você quer, tenta ai, se não for posta novamente.
Se for isso e tiver dificuldades ainda, posta qual é a entidade que vc ta usando para facilitar no entendimento.

Abraços.

[quote=marlonfa]Não sei se entendi bem sua explicação, mas se for oq eu entendi, vc não passa um MAP para o seu gerarRelatorioWeb:

gerarRelatorioWeb(jrds, null, arquivo);

Vc está passando null.

O uso do map é para facilitar você passar valores do seu objeto para o seu relatório.

Exemplo:

Map parametros = new HashMap();
parametros.put("nomeDoSeuParametroNoRelatorio", nomeDoSeuAtributo); 
gerarRelatorioWeb(jrds, parametros, arquivo); 

Caso for isso que você quer, tenta ai, se não for posta novamente.
Se for isso e tiver dificuldades ainda, posta qual é a entidade que vc ta usando para facilitar no entendimento.

Abraços.[/quote]

Boa tarde amigo

Assim eu implementei o que vc mencionou, ficou assim…

public void gerarRelatorio() {
		int id = (Integer) JsfHelper.getSessionAttribute("idSolGer");
		ExternalContext externalContext = FacesContext.getCurrentInstance()
				.getExternalContext();
		ServletContext context = (ServletContext) externalContext.getContext();
		String arquivo = context.getRealPath("relatorios/relatorio.jasper");
		JRDataSource jrds = new JRBeanCollectionDataSource(listarCidades());
		
		JRDataSource jrds2 = new JRBeanCollectionDataSource(listarEntregas());

	        
	    Map<String, Integer> parametros = new HashMap<String, Integer>();  
	    parametros.put("idSolGer", id);   
		
		gerarRelatorioWeb(jrds, parametros, arquivo);
	}

Porém eu preciso enviar o jrds2 também.
o meu relaório está com um SQL imbutido lá… q se eu colocando o um ID manualemnte, me pede o parâmentro da cidades, das entregas.
Se vc me passar um e-mail eu te envio os arquivos e vc dá uma olhada
Outra coisa, o erro tá dando no segundo métodos agora…

private void gerarRelatorioWeb(JRDataSource jrds, Map<String, Integer> parametros, String arquivo) {
		ServletOutputStream servletOutputStream = null;
		FacesContext context = FacesContext.getCurrentInstance();
		HttpServletResponse response = (HttpServletResponse) context
				.getExternalContext().getResponse();

		try {
			servletOutputStream = response.getOutputStream();
			JasperRunManager.runReportToPdfStream(new FileInputStream(new File(
					arquivo)), response.getOutputStream(), parametros, jrds); // Nesta linha está dando o erro NullPointerException
			response.setContentType("application/pdf");
			servletOutputStream.flush();
			servletOutputStream.close();
			context.renderResponse();
			context.responseComplete();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

Desde já agradeço.