Problema com Left Join com annotations em JPA

3 respostas
regifelix

Estou com um problema em um mapeamento onde tenho duas tabelas NOTA_FISCAL e GUIA_NOTA
Uma guia_nota pode ter varias notas fiscais e uma nota pode ter apenas uma guia_nota relacionada
E tem o caso de notas fiscais que nao tem nenhuma guia_nota

Quando executo uma namedQuery do Guia_Nota esta tudo ok, porém quando executo uma da Nota_Fiscal obtenho o seguinte erro :

javax.ejb.EJBException: javax.persistence.EntityNotFoundException: Unable to find br.com.dsfnet.manutencao.entity.Guia_Nota with id 19186

O problema é que tenho notas fiscais que não têm nenhuma guia_nota relacionada, O que eu devo colocar na Classe Nota_Fiscal para fazer o Left Join ja possibilitando que sejam retornadas essas notas sem guia para que o erro nâo ocorra ?

Segue as duas entidades abaixo:

@Table(name = "GUIA_NOTA")
public class Guia_Nota implements Serializable  {

	private static final long serialVersionUID = -5556925083800983578L;

                 @Id
	@Column(name = "ID_GUIA_NOTA", nullable = false)
	private Long id_guia_nota;

	@Column(name = "ID_GUIA", nullable = false)
	private Long id_guia;

	
	@Column(name = "ID_NOTA_FISCAL", nullable = false)
	private Long id_nota_fiscal;

	@Transient
	private Long QtdNotas;

    @OneToMany(mappedBy="guia_nota", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    private List<Nota_Fiscal> nota_fiscal;

    public Long getId_guia_nota() {
		return id_guia_nota;
	}

	public void setId_guia_nota(Long id_guia_nota) {
		this.id_guia_nota = id_guia_nota;
	}

	public Long getId_guia() {
		return id_guia;
	}

	public void setId_guia(Long id_guia) {
		this.id_guia = id_guia;
	}

	public Long getId_nota_fiscal() {
		return id_nota_fiscal;
	}

	public void setId_nota_fiscal(Long id_nota_fiscal) {
		this.id_nota_fiscal = id_nota_fiscal;
	}

	public Long getQtdNotas() {
		return QtdNotas;
	}

	public void setQtdNotas(Long qtdNotas) {
		QtdNotas = qtdNotas;
	}

	public List<Nota_Fiscal> getNota_fiscal() {
		return nota_fiscal;
	}

	public void setNota_fiscal(List<Nota_Fiscal> nota_fiscal) {
		this.nota_fiscal = nota_fiscal;
	}

}

Entidade NOTA_FISCAL

@Table(name = "NOTA_FISCAL")
public class Nota_Fiscal implements Serializable {
	
	private static final long serialVersionUID = 8978798023090144826L;

	@Id
	@Column(name = "ID_NOTA_FISCAL", nullable = false)
	private Long id_nota_fiscal;

	@Column(name = "COD_CID")
	private Long codcid;

	@Column(name = "NUM_NOTA")
	private Long num_nota;

	@Column(name = "PREST_INSCRICAO_MUNICIPAL")
	private String prest_inscricao_municipal;

	@Column(name = "RPS_NUM")
	private Long rps_num;

//MAPEAMENTO COM A GUIA_NOTA
	@ManyToOne
	@JoinColumn(name = "id_nota_fiscal")
	public Guia_Nota guia_nota;

	public Long getId_nota_fiscal() {
		return id_nota_fiscal;
	}

	public void setId_nota_fiscal(Long id_nota_fiscal) {
		this.id_nota_fiscal = id_nota_fiscal;
	}

	public Long getNum_nota() {
		return num_nota;
	}

	public void setNum_nota(Long num_nota) {
		this.num_nota = num_nota;
	}

	public String getPrest_inscricao_municipal() {
		return prest_inscricao_municipal;
	}

	public void setPrest_inscricao_municipal(String prest_inscricao_municipal) {
		this.prest_inscricao_municipal = prest_inscricao_municipal;
	}

	public Long getRps_num() {
		return rps_num;
	}

	public void setRps_num(Long rps_num) {
		this.rps_num = rps_num;
	}

	public Long getCodcid() {
		return codcid;
	}

	public void setCodcid(Long codcid) {
		this.codcid = codcid;
	}



}

3 Respostas

R

kd a query??

regifelix

Eu tinha copiado somente a classe sem as NamedQuery segue novamente as duas classes :

package br.com.dsfnet.manutencao.entity;

import java.io.Serializable;
import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.persistence.Transient;

@Entity
@NamedQueries({
	@NamedQuery(name = "SolicitacaoGuiaNotaPorIdGuia", query = "Select o From Guia_Nota o Where o.id_guia =:id_guia")
})
@Table(name = "GUIA_NOTA")

public class Guia_Nota implements Serializable  {

	/**
	 *
	 */
	private static final long serialVersionUID = -5556925083800983578L;


	@Column(name = "ID_GUIA_NOTA", nullable = false)
	private Long id_guia_nota;

	@Column(name = "ID_GUIA", nullable = false)
	private Long id_guia;

	@Id
	@Column(name = "ID_NOTA_FISCAL", nullable = false)
	private Long id_nota_fiscal;

	@Transient
	private Long QtdNotas;

    @OneToMany(mappedBy="guia_nota", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    private List<Nota_Fiscal> nota_fiscal;

    public Long getId_guia_nota() {
		return id_guia_nota;
	}

	public void setId_guia_nota(Long id_guia_nota) {
		this.id_guia_nota = id_guia_nota;
	}

	public Long getId_guia() {
		return id_guia;
	}

	public void setId_guia(Long id_guia) {
		this.id_guia = id_guia;
	}

	public Long getId_nota_fiscal() {
		return id_nota_fiscal;
	}

	public void setId_nota_fiscal(Long id_nota_fiscal) {
		this.id_nota_fiscal = id_nota_fiscal;
	}

	public Long getQtdNotas() {
		return QtdNotas;
	}

	public void setQtdNotas(Long qtdNotas) {
		QtdNotas = qtdNotas;
	}

	public List<Nota_Fiscal> getNota_fiscal() {
		return nota_fiscal;
	}

	public void setNota_fiscal(List<Nota_Fiscal> nota_fiscal) {
		this.nota_fiscal = nota_fiscal;
	}

}

Nota_Fiscal

package br.com.dsfnet.manutencao.entity;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Entity
@NamedQueries( {
	@NamedQuery(name = "SolicitacaoNotaFiscalPorId", query = "Select o From Nota_Fiscal o where o.id_nota_fiscal=:id_nota_fiscal"),
	@NamedQuery(name = "SolicitacaoNotaFiscalPorRps", query = "Select o From Nota_Fiscal o where o.prest_inscricao_municipal=:im and o.rps_num =:numrps and o.codcid=:codcid")})
@Table(name = "NOTA_FISCAL")
public class Nota_Fiscal implements Serializable {

	/**
	 *
	 */
	private static final long serialVersionUID = 8978798023090144826L;

	@Id
	@Column(name = "ID_NOTA_FISCAL", nullable = false)
	private Long id_nota_fiscal;

	@Column(name = "COD_CID")
	private Long codcid;

	@Column(name = "NUM_NOTA")
	private Long num_nota;

	@Column(name = "PREST_INSCRICAO_MUNICIPAL")
	private String prest_inscricao_municipal;

	@Column(name = "RPS_NUM")
	private Long rps_num;

	//

	@ManyToOne
	@JoinColumn(name = "id_nota_fiscal")
	public Guia_Nota guia_nota;

	public Long getId_nota_fiscal() {
		return id_nota_fiscal;
	}

	public void setId_nota_fiscal(Long id_nota_fiscal) {
		this.id_nota_fiscal = id_nota_fiscal;
	}

	public Long getNum_nota() {
		return num_nota;
	}

	public void setNum_nota(Long num_nota) {
		this.num_nota = num_nota;
	}

	public String getPrest_inscricao_municipal() {
		return prest_inscricao_municipal;
	}

	public void setPrest_inscricao_municipal(String prest_inscricao_municipal) {
		this.prest_inscricao_municipal = prest_inscricao_municipal;
	}

	public Long getRps_num() {
		return rps_num;
	}

	public void setRps_num(Long rps_num) {
		this.rps_num = rps_num;
	}

	public Long getCodcid() {
		return codcid;
	}

	public void setCodcid(Long codcid) {
		this.codcid = codcid;
	}



}

Quando faço chamada a namedQuery SolicitacaoNotaFiscalPorRps ele apresenta o erro :
javax.ejb.EJBException: javax.persistence.EntityNotFoundException: Unable to find br.com.dsfnet.manutencao.entity.Guia_Nota with id 18766
Esse erro ocorre porque uma nota não tem um guia_nota
Minha pergunta é o que eu tenho que modificar na classe NOTA_FISCAL para trazer as notas que tem guia_nota e as que nao tem sem apresentar o erro.

visola

Pelo que diz na sua exceção, não é o problema no join, é na guia_nota. Você tem um registro na tabela GUIA_NOTA com ID 18766 ou 19186?
Se não, em algum momento, ou você está tentando carregar um registro que não existe, ou algum registro em outra tabela está com relacionamento quebrado.

Pelo seu código, não deveria existir uma tabela de relacionamento entre as duas.
Se existe, você talvez tenha algum registro que aponta para registros que não existem.

Criado 13 de janeiro de 2011
Ultima resposta 13 de jan. de 2011
Respostas 3
Participantes 3