Consulta Hibernate - utilizando criteria

10 respostas
S

Olá,

Consegui fazer a pesquisa funcionar em uma tabela… Segue o código abaixo… Agora o que eu preciso é de inner join utilizando o criteria…

public List listaCriterio(Class clazz,String atributo, String criterio){           
         List lista=null;
         Criteria crit = HibernateUtility.getSession().createCriteria(clazz,atributo);
         crit.add(Restrictions.like(atributo,"%"+criterio+"%") );
         crit.addOrder(Order.asc(atributo));
         crit.setMaxResults(30);
         lista=crit.list();
         return lista;
     }

Gostaria de fazer algo desse tipo…

select cidade.nome, estado.sigla from cidade inner join estado on estado.idestado=cidade.idestado;

Se alguém puder ajudar…
Obrigado

Diego

10 Respostas

plentz

Você colocou o relacionamento no seu mapeamento?

S

Olha o arquivo hibernate.cfg…

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
        
<hibernate-configuration>
    <session-factory>

        <property
            name="hibernate.dialect">
            org.hibernate.dialect.MySQLDialect
        </property>
        <property
            name="hibernate.connection.driver_class">
            com.mysql.jdbc.Driver
        </property>
        <property
            name="hibernate.connection.url">
            jdbc:mysql://localhost/bancoestagio?autoReconnect=true
        </property>
        <property
            name="hibernate.connection.username">
            root
        </property>
        <property
            name="hibernate.connection.password">
            root
        </property>

        <!-- Condiguração do c3p0 -->

        <property name="hibernate.c3p0.max_size">10</property>
        <property name="hibernate.c3p0.min_size">2</property>
        <property name="hibernate.c3p0.timeout">5000</property>
        <property name="hibernate.c3p0.max_statements">10</property>
        <property name="hibernate.c3p0.idle_test_period">3000</property>
        <property name="hibernate.c3p0.acquire_increment">2</property>

        <!-- Configurações de debug -->

        <property name="show_sql">true</property>
        <property name="use_outer_join">true</property>
        <property name="hibernate.generate_statistics">true</property>
        <property name="hibernate.use_sql_comments">true</property>

        <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

        
        <mapping class="br.com.sisestagioII.modelo.Estado" />
        <mapping class="br.com.sisestagioII.modelo.Cidade" />
        <mapping class="br.com.sisestagioII.modelo.Pessoa" />
        <mapping class="br.com.sisestagioII.modelo.Cliente" />
        <mapping class="br.com.sisestagioII.modelo.Funcionario"/>
        <mapping class="br.com.sisestagioII.modelo.Fornecedor"/>
        
        
    </session-factory>
</hibernate-configuration>

Classe Estado

package br.com.sisestagioII.modelo;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity()
public class Estado {
    
    @Id()@GeneratedValue()
    private int idEstado;
    private String nome;
    @Column(length = 2)
    private String sigla;
    
    public Estado() {
    }
    
    public long getIdEstado() {
        return idEstado;
    }
    
    public void setIdEstado(int idEstado) {
        this.idEstado = idEstado;
    }
    
    public String getNome() {
        return nome;
    }
    
    public void setNome(String nome) {
        this.nome = nome;
    }
    
    public String getSigla() {
        return sigla;
    }
    
    public void setSigla(String sigla) {
        if (sigla.length()==2){
            this.sigla = sigla;
        }
    }
    
}

Classe Cidade

package br.com.sisestagioII.modelo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity()
public class Cidade {
    
    @Id()@GeneratedValue()
    private int idCidade;
    
    private String nome;
    
    @ManyToOne()
    private Estado estado;
    
    public Cidade() {
    }  
    
    public long getIdCidade() {
        return idCidade;
    }
    
    public void setIdCidade(int idCidade) {
        this.idCidade= idCidade;
    }
    
    public String getNome() {
        return nome;
    }
    
    public void setNome(String nome) {
        this.nome = nome;
    }
    
    
    public Estado getEstado() {
        return estado;
    }
    
    public void setEstado(Estado estado) {
        this.estado = estado;
    }
    
}

Obrigado pela ajuda

Diego

plentz

http://www.hibernate.org/hib_docs/v3/reference/en/html_single/#querycriteria-associations

S

Já andei olhando ai e nada… ta complicado…

Mesmo assim obrigado pela dica.

:frowning:

É to vendo que vou ter que acabar usando o hql…

Diego Alves Brandão

J

Cara usa o seguinte

crit.createAlias(“c.estado”,“e”);

daí é só usar e.qualquerAtributoDeEstado

è isso qu tu queria?

[]s

J

Só não esquece que vc tem que ter mapeado teu relacionamento no hbm e não só no pojo.

[]s

urubatan

ele ta usando anotações, não tem hbm :smiley:

J

Pouts, passei batido :s, é o costume de usar uma coisa e supor que todo mundo usa a mesma coisa :s

[]s

Paulo_Silveira

algo assim:

Criteria cri = session.createCriteria(Cidade.class);
cri = cri.createCriteria("estado"); (se sua Class cidade tem um Estado estado)
cri.add(Restriction.eq("nome", "xpto");
cri.list();
S

Funcionou…

Deu certo com o exemplo do Paulo…

Obrigado a todos pela ajuda…

Valew

Diego

Criado 15 de setembro de 2006
Ultima resposta 17 de set. de 2006
Respostas 10
Participantes 5