[Resolvido] Consulta com Criteria entre três entidades

Olá, boa tarde!

Tenho uma dúvida para fazer consultas com a API Criteria.

Tenho três classes/entidades:
POJO:
Veiculo{marca, ano, modelo}

Cliente{ nome, cpf, Veiculo veiculo }

Anuncio{descricao, data, Cliente cli }

Sendo assim, um Anuncio tem um Cliente e o cliente tem um ou mais Veiculo a ser anunciado para venda.

minha dúvida é na busca com Criteria, eu quero buscar um anuncio por CPF do cliente e outra busca por marca do Veiculo, posso fazer assim?:


... Parte do código

Criteria criteria = session.createCriteria(Anuncio.class);

public void configureCriteria(Criteria criteria, SearchCriteria search) throws Exception{
	if(criteria != null && search != null)
	{
	    switch (search.getSearchType()) {

        case SEARCH_BY_CPF:
	  criteria = criteria.createCriteria("cli");
	  criteria.add(Restrictions.eq("cpf", search.getValue()));
	  break;

       case SEARCH_BY_MARCA:
	  criteria = criteria.createCriteria("cli");
	  criteria = criteria.createCriteria("veiculo");
	  criteria.add(Restrictions.like("marca", search.getValue().toString()));
	  break;

     ... mais consultas

Obs: é meu primeiro contato com essa API de consulta no banco de dados.

Muito Obrigado!

Bom eu acabei de fazer um TestUnitário com JUnit e deu certo:

Segue a consuta:

case SEARCH_BY_MODELO: criteria = criteria.createCriteria("cli"); criteria = criteria.createCriteria("veiculo"); criteria.add(Restrictions.ilike("modelo", search.getValue().toString())); break;

Segue o Test:

// buscando pelo Modelo do veiculo parameters.add(new SearchCriteria(FactoryAnuncio.SEARCH_BY_MODELO, "g5")); List<Anuncio> result3 = factory.getAnuncio(parameters); Anuncio anuncio3 = result3.get(0); String modelo = anuncio3.getCli().getVeiculo().getModelo(); System.out.println(modelo); parameters.clear(); System.out.println("modelo OK"); assertTrue(result3.contains(savedAnuncios.get(0)));

Segue o Console:

Hibernate: select this_.ID as ID0_2_, this_.DT_ANUNCIO as DT2_1_2_, this_.DESCRICAO as DESCRICAO1_2_, this_.CLI as CLI1_2_, this_.FORMAPAGAMENTO as FORMAPAG5_1_2_, cliente1_.ID as ID0_0_, cliente1_.CPF as CPF2_0_, cliente1_.EMAIL as EMAIL2_0_, cliente1_.NOME as NOME2_0_, cliente1_.SEXO as SEXO2_0_, cliente1_.DATA_NASC as DATA6_2_0_, cliente1_.RUA as RUA2_0_, cliente1_.NR_RUA as NR8_2_0_, cliente1_.BAIRRO as BAIRRO2_0_, cliente1_.CIDADE as CIDADE2_0_, cliente1_.ESTADO_CIDADE as ESTADO11_2_0_, cliente1_.VEICULO as VEICULO2_0_, veiculo2_.ID as ID0_1_, veiculo2_.MARCA as MARCA3_1_, veiculo2_.TIPO_FINALIDADE as TIPO3_3_1_, veiculo2_.MODELO as MODELO3_1_, veiculo2_.ANO as ANO3_1_, veiculo2_.COR as COR3_1_ from ANUNCIO this_ inner join ENTITY this_1_ on this_.ID=this_1_.ID inner join CLIENTE cliente1_ on this_.CLI=cliente1_.ID left outer join ENTITY cliente1_1_ on cliente1_.ID=cliente1_1_.ID inner join VEICULO veiculo2_ on cliente1_.VEICULO=veiculo2_.ID left outer join ENTITY veiculo2_1_ on veiculo2_.ID=veiculo2_1_.ID where veiculo2_.MODELO ilike ? g5 modelo OK

Como eu disse, funcionou e minha dúvida parece ter sido sanada, agora fica o desafio de fazer de uma maneira melhor essa consulta com Criteria, não sei se é o ideal isso o que eu fiz, pq estou tendo um primeiro contato com Criteria, não tenho uma opinão formada sobre o assunto.

Pelo que entendi dessa consulta, eu informei para Criteria a classe base Anuncio.class, que por sinal conhece um Cliente e cliente que conhece um Veiculo para anunciar.

para facilitar a leitura do código, nesse meu caso, o criterio de busca é o + um Inteiro que faz referência a uma constante de um tipo de busca SEARCH_BY_ETC.