Duvida Hibernate Criteria + DetachedCriteria

4 respostas
K

E ae Pessoal,

estou com um problema em uma consulta com criteria

estou tentando criar o seguinte sql em criteria

select b.cli_codext               vis_cli_codigo, 
       b.cli_fili                 vis_cli_filial, 
       b.cli_razaosocial          cli_razaosocial,
       b.cli_nomefantasia         nome_fantasia,
       b.cli_cidade               cidade,
       b.cli_estado               UF,
       (select count(*) 
          from visita v1
         where v1.vis_cli_codigo = b.cli_codext
           and v1.vis_cli_filial = b.cli_fili
           and v1.vis_tipovis_id = 1 ) consultiva
  from cliente b
 where (b.cli_codext, b.cli_fili) in
       (select v.vis_cli_codigo, v.vis_cli_filial
          from visita v
         where v.vis_tec_codext = 414042
           and trunc(vis_data) >= to_date('01/01/2011','dd/MM/yyyy'))
  order by cli_razaosocial

eu ja possuo as duas consultas prontas

a primeira

(select count(*) 
          from visita v1
         where v1.vis_cli_codigo = b.cli_codext
           and v1.vis_cli_filial = b.cli_fili
           and v1.vis_tipovis_id = 1 

DetachedCriteria subQuery1 = DetachedCriteria.forClass(Visita.class, "v")
				.createAlias("v.tipo", "tv", Criteria.INNER_JOIN)
				.add(Restrictions.eq("tv.id", new Long(1)))
				.setProjection(Projections.alias(Projections.rowCount(), "CONSULTIVA"));

e a segunda

Criteria c = session.createCriteria(Cliente.class, "c")
                   .add(Restrictions.in("c.id", subQueryVisita.getExecutableCriteria(session).list()))
                   .addOrder(Order.asc("razaoSocial"));

mas não sei como unir as duas para representar o sql acima, eu conheco somente quando uma subquery esta na clausula where
agora desta maneira acima nao.

Preciso de uma dica de como unir as duas consultas

4 Respostas

fbl.lucas

Cara até onde sei não é possível fazer isso com Criteria, lembro de ja ter tentado.
Talvez em HQL, mas acredito que também não funcione.
Você poderia criar uma view com o script abaixo, mapea-la e referencia-la na entidade Cliente.

select  v1.vis_cli_codigo, v1.vis_cli_filial, count(*) 
from visita v1
where  v1.vis_tipovis_id = 1 
group by v1.vis_cli_codigo, v1.vis_cli_filial
K

Mais como referenciar na Cliente?

fbl.lucas

ksio_thadeu:
Mais como referenciar na Cliente?

Primeiramente você sabe como criar uma view? Caso sim, você vai mapea-la como uma entidade qualquer pois ela funciona como uma tabela no banco.
e em Cliente você teria algo assim:

@ManyToOne
@JoinColumns({
    @JoinColumn(name = "cli_codext", referencedColumnName = "vis_cli_codigo", insertable = false, updatable = false),
    @JoinColumn(name = "cli_fili", referencedColumnName = "vis_cli_filial", insertable = false, updatable = false)
})
private ViewVisita visitas;
K

Sim eu sei criar uma view, mais eu optei pela solucao de realizar a consulta com HQL.

Vlw, Obrigado

Criado 14 de fevereiro de 2012
Ultima resposta 16 de fev. de 2012
Respostas 4
Participantes 2