[RESOLVIDO] Criteria SubSelect

2 respostas
D

Ola Galera alguem pode me ajudar com o criteria estou tentando fazer um subselect mas nao to sabendo como fazer.

abaixo irei posta o codigo do criteria e depois como eu gostaria que ficasse em sql.

public Map<String, List<CevsCodigo>> pesquisaLaudaCevs(List<Acompanhamento> acompanhamentos) {
		Session session = getSession();
		Criteria criteria = null;
		//Criteria subCriteria = null;
		Map<String, List<CevsCodigo>> map = new HashMap<String, List<CevsCodigo>>();

		for(Acompanhamento acomp : acompanhamentos) {
										
			DetachedCriteria dc = DetachedCriteria.forClass(Acompanhamento.class);
			dc.createAlias("cevsSolicitacaoIdentificacao", "cevsSolicitacaoIdentificacao");			
			dc.createAlias("cevsSolicitacaoIdentificacao.codigoCevs", "codigoCevs");
			dc.setProjection(Projections.distinct(Projections.property("codigoCevs.codigoCevs")));	
			dc.add(Restrictions.like("cevsSolicitacaoIdentificacao.protocolo", acomp.getCevsSolicitacaoIdentificacao().getProtocolo()));
			//map.put(acomp.getCevsSolicitacaoIdentificacao().getProtocolo(), (List<CevsCodigo>) criteria.list());
			
			criteria = session.createCriteria(Acompanhamento.class);
			criteria.createAlias("cevsSolicitacaoIdentificacao", "cevsSolicitacaoIdentificacao");
			criteria.createAlias("cevsSolicitacaoEquipamento", "cevsSolicitacaoEquipamento");
			criteria.createAlias("cevsSolicitacaoEquipamento.codigoCevs", "codigoCevs");			
			criteria.setProjection(Projections.distinct(Projections.property("codigoCevs.codigoCevs")));			
			criteria.add(Restrictions.like("cevsSolicitacaoIdentificacao.protocolo", acomp.getCevsSolicitacaoIdentificacao().getProtocolo()));			
			map.put(acomp.getCevsSolicitacaoIdentificacao().getProtocolo(), (List<CevsCodigo>) criteria.list());			
			
		}
		return  map;
	}
select
        distinct codigocevs3_.codigo_cevs as y0_, (select
        distinct codigocevs2_.codigo_cevs as y0_ 
    from
        acompanhamento this_ 
    inner join
        cevs_solicit_identificacao cevssolici1_ 
            on this_.cevs_solicit_identificacao_id=cevssolici1_.cevs_solicit_identificacao_id 
    inner join
        cevs_codigo codigocevs2_ 
            on cevssolici1_.cevs_codigo_id=codigocevs2_.cevs_codigo_id 
    where
        cevssolici1_.protocolo like '008873/2009-N01') 
    from
        acompanhamento this_ 
    inner join
        cevs_solicit_equipamento cevssolici2_ 
            on this_.cevs_solicit_equipamento_id=cevssolici2_.cevs_solicit_equipamento_id 
    inner join
        cevs_codigo codigocevs3_ 
            on cevssolici2_.cevs_codigo_id=codigocevs3_.cevs_codigo_id 
    inner join
        cevs_solicit_identificacao cevssolici1_ 
            on this_.cevs_solicit_identificacao_id=cevssolici1_.cevs_solicit_identificacao_id 
    where
        cevssolici1_.protocolo like '008873/2009-N01'

abs a Todos...

2 Respostas

C

Não consegui visualizar onde você vincula a instancia dc a sua Criteria, mas você pode encontrar mais detalhes de como usar Detached Criteria em 15.8. Detached queries and subqueries

Outra dica seria usar HQL, por ser mais simples de implementar queries desse tipo…
Qual seria o código final SQL esperado?

D

Acabei resolvendo de uma outra forma, acredito q nao seja a forma mais correta mas no momento foi o que deu pra fazer ate eu melhora-la

public Map<String, List<CevsCodigo>> pesquisaLaudaCevs(List<Acompanhamento> acompanhamentos) {
		Session session = getSession();
		Criteria criteria = null;		
		Map<String, List<CevsCodigo>> map = new HashMap<String, List<CevsCodigo>>();

		for(Acompanhamento acomp : acompanhamentos) {
						
			criteria = session.createCriteria(Acompanhamento.class);			
			//DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Acompanhamento.class);
			criteria.createCriteria("cevsSolicitacaoEquipamento", "cevsSolicitacaoEquipamento", criteria.LEFT_JOIN);
			criteria.createCriteria("cevsSolicitacaoIdentificacao", "cevsSolicitacaoIdentificacao", criteria.LEFT_JOIN);			
			criteria.createCriteria("cevsSolicitacaoEquipamento.codigoCevs", "codigoCevs", criteria.LEFT_JOIN);			
			criteria.createCriteria("cevsSolicitacaoIdentificacao.codigoCevs", "codigoCevs2", criteria.LEFT_JOIN);
			criteria.setProjection(Projections.distinct(Projections.property("codigoCevs.codigoCevs")));
			ProjectionList pl = Projections.projectionList();
			pl.add(Projections.groupProperty("codigoCevs.codigoCevs"));
			pl.add(Projections.groupProperty("codigoCevs2.codigoCevs"));
			criteria.setProjection(pl);
			criteria.add(Restrictions.like("cevsSolicitacaoIdentificacao.protocolo", acomp.getCevsSolicitacaoIdentificacao().getProtocolo()));
			map.put(acomp.getCevsSolicitacaoIdentificacao().getProtocolo(), (List<CevsCodigo>) criteria.list());
									
			 
		}
		return  map;
	}

Obrigado.

Criado 20 de janeiro de 2012
Ultima resposta 27 de jan. de 2012
Respostas 2
Participantes 2