Criteria entre entidades associativas!

14 respostas
N

Bom tarde Senhores, estou tentando desenvolver uma combo aninha no qual preciso de uma criteria… é o seguinte tenhu a Unidade e o Departamento estre elas um método criteria … eu passo minha unidade por parametro e teria que me retornar o departamento porem não estou conseguindo…

Segue o método abaixo…

public List<Departamento> consultaDepartamentos(Unidade unidade) {

        Session session;
        if (em.getDelegate() instanceof EntityManagerImpl) {
            EntityManagerImpl entityManagerImpl = (EntityManagerImpl) em.getDelegate();
            session = entityManagerImpl.getSession();
        } else {
            session = (Session) em.getDelegate();
        }

        Criteria crit = session.createCriteria(UnidadeDepartamento.class);
        crit.add(Restrictions.eq("unidade", unidade));
        return crit.list();
    }

A entidade UnidadeDepartamento é associativa… alguem sabe me dizer mue erro? obrigado

14 Respostas

drsmachado

Para que isto

Criteria crit = session.createCriteria(UnidadeDepartamento.class);   
    crit.add(Restrictions.eq("unidade", unidade));

funcione, é necessário que unidade seja um atributo de UnidadeDepartamento.
Você disse que UnidadeDepartamento é associativa, mas como essa associação está feita?
Cadê as classes?

Posta elas aí

N

eu fiz da seguinte forma

Unidade - ManyToMany com Departamento , Departamento ManyToMany com Unidade… na entidade UnidadeDepartamentoa 2 relacionamentos ManyToOne com Unidade,Departamento…

drsmachado

nepsterbr:
eu fiz da seguinte forma

Unidade - ManyToMany com Departamento , Departamento ManyToMany com Unidade… na entidade UnidadeDepartamentoa 2 relacionamentos ManyToOne com Unidade,Departamento…


Tá sem o código ai?
Consegue postar as classes???

N

Unidade

@Entity
@Table(name = "unidade")
@SequenceGenerator(name = "unidade_seq", sequenceName = "unidade_seq")
public class Unidade implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "unidade_seq")
    @Column(name = "id_unidade")
    private Long id;
    
    @ManyToMany(fetch= FetchType.EAGER, cascade= CascadeType.ALL)
    @JoinTable(name="unidadeDepartamento",joinColumns={@JoinColumn(name="id_unidade")},
                                          inverseJoinColumns={@JoinColumn(name="id_departamento")})
    private List&lt;Departamento&gt; departamento = new ArrayList&lt;Departamento&gt;();

Departamento

@Entity
@Table(name="departamento")
@SequenceGenerator(name="departamento_seq" , sequenceName="departamento_seq")
public class Departamento implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO , generator="departamento_seq")
    @Column(name="id_departamento")
    private Long id;
   
    @ManyToMany(fetch= FetchType.EAGER)
    @JoinTable(name="unidadeDepartamento", joinColumns={@JoinColumn(name="id_departamento")},
                                           inverseJoinColumns={@JoinColumn(name="id_unidade")})
    @Cascade(org.hibernate.annotations.CascadeType.ALL)
    private List&lt;Unidade&gt; unidade = new ArrayList&lt;Unidade&gt;();

Unidade Departamento

@Embeddable
public class UnidadeDepartamento implements Serializable {
    
    @ManyToOne(fetch= FetchType.EAGER)
    @JoinColumn(name="id_unidade")
    @Cascade(CascadeType.ALL)
    private Unidade unidade;
    
    @ManyToOne(fetch= FetchType.EAGER)
    @JoinColumn(name="id_departamento")
    @Cascade(CascadeType.ALL)
    private Departamento departamento;
}
drsmachado

Camarada, pela estrutura, com certeza você precisará criar um alias para a unidade e outro para o departamento.
Somente desta forma você conseguirá fazer isso buscar algo.

N

desculpe a ignorância, mais oque seria essa alias? tem algum exemplo??

drsmachado

Aqui eu não tenho, vai ter que procurar no google ou na documentação.
Mas, entenda, você precisa pegar um tipo de objetos que não estão mapeados na forma como você criou a query.
Se formos considerar a criteria que você aplicou, teríamos uma query assim

"select * from unidadedepartamento where unidade.id_unidade = ?"

onde o ? recebe o id passado como parâmetro.
Consegue entender que não há como achar os departamentos?
Você precisa de um alias, para definir que está buscando os departamentos.

N

certo eu fiz mais ou menos assim, porem me retorna Null Pointer…

public List<Departamento> consultaDepartamentos(Unidade unidade) {


    Criteria crit = session.createCriteria(Departamento.class);
    crit.add(Restrictions.eq("unidade", unidade));
        Departamento d = (Departamento) crit.uniqueResult();
        crit.createAlias("unidade", "unidade"); 
        crit.add(Restrictions.eq("departamento",d.getDepartamento())); 
    return crit.list();
}
drsmachado

NPE onde?

N

aqui…

crit.add(Restrictions.eq("departamento",d.getDepartamento()));
drsmachado

Isso ocorre por que o objeto d está nulo…

N

é isso eu sei agora o fato é qual motivo???! huauhahuuhauh

drsmachado

Departamento d = (Departamento) crit.uniqueResult(); retorna null

N

certo…

Minha criteria está desta forma…

public List<Departamento> consultaDepartamentos(Unidade unidade) {
        Criteria crit = session.createCriteria(Departamento.class);
        crit.createAlias("unidade", "unidade");
        crit.add(Restrictions.eq("unidade", unidade.getDepartamento()));

return crit.list();
}

e o seguinte erro é me retornado…

Caused by: org.hibernate.exception.GenericJDBCException: could not execute query
Caused by: java.sql.SQLException: Parâmetro IN ou OUT ausente do índice:: 1

qual seria o erro?

Criado 3 de outubro de 2011
Ultima resposta 4 de out. de 2011
Respostas 14
Participantes 2