Dúvida Inner Join Hibernate

4 respostas
desk

Olá pessoal, fiz um método para buscar todas cidades relacionadas a tal estado. Passo o id do estado, e então ele me retorna todas as cidades que tem esse id de estado.

Porém com um teste rápido eu vi que ele está dando 2 selects.. um na table de cidade e outra em estado.

Gostaria de saber o porque de não estar dando inner join, e no caso só fazer 1 select? Segue o código:
public class CidadeDAO {
	private final DAO<Cidade> dao ;
	private EntityManager em ;

	
	public CidadeDAO(EntityManager em) {
		dao = new DAO<Cidade>(em, Cidade.class) ;
		this.em = em ;
	}
	
	@SuppressWarnings("unchecked")
	public List<Cidade> listaCidadesDoEstado(Integer idEstado) {
		String jpql = "select c from Cidade c where c.estado.id = :pIdEstado" ;
		
		Query query = this.em.createQuery(jpql).setParameter("pIdEstado", idEstado) ;
		
		return query.getResultList() ;
	}
}
public class TestaListaCidadesPorEstado {
	public static void main(String[] args) {
		EntityManager em = new JPAUtil().getEntityManager() ;
		CidadeDAO dao = new CidadeDAO(em) ;
		
		List<Cidade> listaCidades =  dao.listaCidadesDoEstado(1) ;
		
		for (Cidade c : listaCidades) {
			System.out.println(c.getNome());
		}
		
	}
}
Hibernate: 
    select
        cidade0_.id as id2_,
        cidade0_.estado_id as estado3_2_,
        cidade0_.nome as nome2_ 
    from
        Cidade cidade0_ 
    where
        cidade0_.estado_id=?
Hibernate: 
    select
        estado0_.id as id3_0_,
        estado0_.nome as nome3_0_ 
    from
        Estado estado0_ 
    where
        estado0_.id=?
sobral
tagua
asa sul
@Entity
public class Cidade {
	@Id
	@GeneratedValue
	private Integer id ;
	private String nome ;
	@ManyToOne
	private Estado estado ; //gas
@Entity
public class Estado {
	@Id
	@GeneratedValue
	private Integer id ;
	private String nome ; //gas

Grato!

4 Respostas

Masami

Coloque um JOIN, assim:

desk

Olá Masami,
mais por default já não era pra fazer o join pq a entidade Cidade tem Estado?
[]s

Masami

isso não sei dizer, estou começando os estudos com JPQL.
…mas da maneira que te passei, vc testou se realiza apenas um select?

desk

Olá Masami,
tentei do jeito que vc falou mas continua dando 2 selects

Porque do hibernate está dando 2 selects? Qual a diferença dos Joins(inner join, outer join, etc) ?

Hibernate: 
    select
        cidade0_.id as id2_,
        cidade0_.estado_id as estado3_2_,
        cidade0_.nome as nome2_ 
    from
        Cidade cidade0_ 
    inner join
        Estado estado1_ 
            on cidade0_.estado_id=estado1_.id 
    where
        estado1_.id=?
Hibernate: 
    select
        estado0_.id as id3_0_,
        estado0_.nome as nome3_0_ 
    from
        Estado estado0_ 
    where
        estado0_.id=?
public List<Cidade> listaCidadesDoEstado(Integer idEstado) {
		String jpql = "select c from Cidade c JOIN c.estado e where e.id = :pIdEstado" ;
		
		Query query = this.em.createQuery(jpql).setParameter("pIdEstado", idEstado) ;
		
		return query.getResultList() ;
	}
Criado 1 de fevereiro de 2011
Ultima resposta 2 de fev. de 2011
Respostas 4
Participantes 2