Hibernate - Consulta gerando produto cartesiano

4 respostas
vinicius_roc

Boa noite pessoal, me deparei com um problema na aplicação e não consigo encontrar a causa.

Tenhos 2 beans

NotaFiscal

@Entity
@Table(name="Nota_Fiscal")
public class NotaFiscal {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    
    private Long numero;
    
    @Column(name="data_emissao")
    private Calendar dtEmissao;
    
    private String hora;
    
    @Column(name="cnpj_emissor")
    private String cnpjEmissor;
    
    @Column(name="valor_total")
    private BigDecimal valorTotal;
    
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="id_dados_adicionais")
    private DadosAdicionais dadosAdicionais;
    
    @ManyToOne
    @JoinColumn(name="id_usuario")
    private Usuario usuario;
    
    @OneToMany(mappedBy = "notaFiscal", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<ItemNF> itens;

e ItemNF

@Entity
@Table(name="Item_NF")
public class ItemNF {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    
    @Column(name="cd_produto")
    private String cdProduto;
    
    private String descricao;
    
    private Integer qtde;
    
    private BigDecimal valor;
    
    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="id_nota_fiscal")
    private NotaFiscal notaFiscal;

Meu problema é quando eu peço para listar a notaFiscal pelo usuario usando o metodo:

public List<NotaFiscal> findByUsuario(Usuario usuario){
        Criteria criteria = getSession().createCriteria(NotaFiscal.class).add(Restrictions.eq("usuario", usuario));
        return criteria.list();
    }

ele gera a seguinte query:

select
        *
    from
        Nota_Fiscal this_ 
    left outer join
        Dados_Adicionais dadosadici2_ 
            on this_.id_dados_adicionais=dadosadici2_.id 
    left outer join
        Categoria categoria3_ 
            on dadosadici2_.id_categoria=categoria3_.id  
    left outer join
        Item_Nf itemNd4_ 
            on this_.id=itemNd4_.id_nota_fiscal
    left outer join
        Usuario usuario5_ 
            on this_.id_usuario=usuario5_.cpf_cnpj 
    left outer join
        Endereco endereco6_ 
            on usuario5_.id_endereco=endereco6_.id 
    left outer join
        Tipo_Usuario tipousuari7_ 
            on usuario5_.id_tipo_usuario=tipousuari7_.id 
    where
        this_.id_usuario=?

E ela me retorna 5 registros em vez de 1 seria o correto, então executei o script no banco tirando o join com a tabela Item_Nf e ele traz correto.

O que esta havendo? Porque ele traz mais registros do que deveria?

Muito Obrigado

4 Respostas

vinicius_roc

Acabei de executar mais 2 testes, onde deixei a lista de itens como LAZY.

No primeiro ele deu lazy e não exibiu a JSP e no segundo, ainda na Action, adicionei um foreach depois da lista e tentei dar um nf.getItens() e ele deu lazy novamente.

vinicius_roc

Por favor, alguem me ajude, não sei mais oque fazer.

lucianotome

Cara, qual o motivo de vc usar:

@ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name="id_nota_fiscal") private NotaFiscal notaFiscal; , nao pode ser:

@ManyToOne(cascade=CascadeType.ALL) private NotaFiscal notaFiscal;

vinicius_roc

como o nome do atributo é diferente da coluna no banco eu precisaria informar o nome da coluna não? e para informar em um relacionamento eu preciso usar JoinColumn certo?

Criado 13 de outubro de 2010
Ultima resposta 14 de out. de 2010
Respostas 4
Participantes 2