Erro no Ireport net.sf.jasperreports.engine.JRException: Error retrieving field value from bean

Bom dia, já procurei um monte de tópico sobre esse tema, mais nenhum apresentou a solução que preciso.

Eu entendo que o erro é gerado por não achar o campo.

Fiz o teste gerando relatórios isolados, sem usar o relacionamento e tudo deu certo…(quer dizer que os campos existem e retornam valores corretamente)

mas na hora que quero gerar o relatório usando relacionamento das entidades através começa aparecer esse erro.

Estou usando Hibernate e ele já gera a query de INNER JOIN automaticamente e desconfio que é por ai a causa do meu problema mas não sei como arrumar , alguém já passou por isso?

Postar o stackTrace completo nos ajudaria mais.

net.sf.jasperreports.engine.JRException: Error retrieving field value from bean : “nome do campo não encontrado”

apenas isso…

Pegue cada field que você tem no iReport e cada atributo do teu bean e verifique se eles estão todos adequados e compatíveis.

Primeiro.
Evite passar seu model pro report, crie uma classe reportModel e monte ele na sua aplicação, se seu model for alterado vc só precisa montar o reportModel com o novo model e não precisa alterar o jrxml.

Segundo.
Monte um reportModel apenas com os campos utilizados neste, sua vida será melhor.

Quer ver só,

Onde eu trabalho eu tive que alterar uns relatórios, para datas menores que 2013 eu uso um conjunto de tabelas, para maiores uso outras.
Quando fui verificar como estava o jrxml, vi que usava diretamente os models das tabelas.
Com isto eu tive de alterar o programa, pra agora montar um reportModel com todos os campos usados no jrxml com os 2 conjuntos de tabelas e alterar o jrxml pra usar apenas um reportModel, se o jrxml já estivesse usando um reportModel eu só precisaria alterar o programas pra montar um reportModel com os dados das novas tabelas.

parece que este história não tem nada a ver com o seu problemas, mas tem, provavelmente vc vai resolver seu problema e vai facilitar as futuras alterações no seu relatório, removendo a dependência do model com o jrxml.

drsmachado eu fiz os testes, consigo gerar os relatórios separados (sem utilizar o relacionamento)

por exemplo tenho a entidade pedido e pessoa, consigo gerar um relatório de pessoa, e outro com o pedido, agora quando uso o relacionamento para trazer os dados de pessoa atraves do pedido o PREVIEW do ireport funciona mas na execução nao funciona.

carlosmoreira
Não entendi a criação de um reportModel, como voc~e faz isso??

valeusz

Detalhe, já testei a query sql, e está correta

Vc cria uma classe que contenha os campos usados no report, or exemplo.

Supomos que vc tenha a atua estrutura com os models das tabelas, Pessoa (nome, cpf, endereco, telefone) e Pedidos (nome, valor, quantidade, descricao).

Vc cria uma classe com o possivel nome:
PedidosPorPessoaReportModel .java

public class PedidosPorPessoaReportModel {
	
	private String nomePessoa;
	private String cpf;
	private String endereco;
	private String telefone;
	
	private Collection<DetalhePedidoReportModel> detalhePedidoCollection;
	
	// getters and setters
}

e outra com o detalhe dos pedidos

public class DetalhePedidoReportModel {
	
	private String nomeProduto;
	private BigDecimal valor;
	private Integer quantidade;
	private String descricao;
	
	// getters and setters
}

vc monta essa estrutura no seu programa e passa pro report, com isso vc remove a dependência do report com os models das tabelas, além de resolver o seu problema.

Por exemplo.

public ArrayList<PedidosPorPessoaReportModel> montaReportModel(ArrayList<Cliente> clienteList) {
		
		ArrayList<PedidosPorPessoaReportModel> pessoasReportModel = new ArrayList<PedidosPorPessoaReportModel>();
		
		PedidosPorPessoaReportModel pessoaMV;
		
		for (Cliente cliente : clienteList) {
			pessoaMV = new PedidosPorPessoaReportModel();
			ArrayList<PedidosPorPessoaReportModel> pedidosReportModel = new ArrayList<PedidosPorPessoaReportModel>();
			DetalhePedidoReportModel pedidoMV;
			
			pessoaMV.setNomePessoa(cliente.getNome());
			// Demais setters
			
			for(Pedido pedido : cliente.getPedidos()) {
				pedidoMV = DetalhePedidoReportModel();
				
				pedidoMV.setNomeProduto(pedido.getProduto().getNome());
				// Demais setters
				
				pedidosReportModel.add(pedidoMV);
			}

			pessoaMV.setDetalhePedidoCollection(pedidosReportModel);
			
			pessoasReportModel.add(pessoaMV);
		}
		
		return pessoasReportModel;
	}

Então vc passa essa coleção pro seu report model, com isso vc não tem que se preocupar com o problema de relacionamentos, já que vc só tem um nível nos models

Seu jrxml ficaria com a segunte estrutura,

Um jrxml que receberia a coleção de clientes, e um subrelatório que receberia a coleção de pedidos, pra cada cliente vc teria sua propria coleção de pedidos e o jrxml faria a iteração normal.

Espero ter ajudado. =]

carlosmoreira obrigado pela ajuda, deu certo aqui…

a unica coisa que fiquei com duvida é como vincular os campos no relatório…

fiz uma gambiarra feia aki, criei uma tabela no banco de dados com todos os campos…

qual seria a forma correta?

prnogue

No jrxml vc cria os campos com os mesmos nomes das variáveis dos classes.

No exemplo que coloquei ficaria assim.

No jrxml pai vc teria os seguintes fields:

String nomePessoa;
String cpf;
String endereco;
String telefone;

e um tipo Collection detalhePedidoCollection, provável que tenha que digitar o nome completamente qualificado no tipo de variável java.util.Collection

Seu jrxml filho irá receber a coleção detalhePedidoCollection e terá os campos da classe DetalhePedidoReportModel .

O report se encarrega de correspnder os campos e fazer as iteralções pra vc.

Vamos supor no jrxml pai que vc queira exibir o nomePessoa, basta criar um field $F{nomePessoa} e pronto.

De uma olhada no métod montaReportModel, é lá que vc deve montar o reportModel que será passado pro relatório.