Hibernate Criteria

5 respostas
V

Estou com o seguinte problema, um banco de imagens
no qual guardo as tags em uma tabela separada e as imagens tbm

Tabelas:
Imagem ( id, titulo, caminho, altura, largura, tamanho, formato)
Tag ( tag )
Imagem_Tag ( imagens_id , tags_tag )

relacionamento ManyToMany Bidirecional
tudo certo até aqui, gostaria de saber se teria como aplicar o seguinte select usando criteria
pra não ter q usar o codigo sql na aplicacao
Só que nao achei nada referente a busca em duas tabelas

Sql:
select * from Imagem,Imagem_Tag where id = imagens_id and ( tags_tag = ‘’ or titulo like ‘%%’ ) group by id

Valeu!

5 Respostas

V

Consegui iniciar, mas o GroupBy nao está funcionando

public List<Imagem> search(String busca) {

        Criteria c = session.createCriteria(Imagem.class, "i");
        
        Criteria subCriteria = c.createCriteria("tags", "t");
        Criterion c1 = Restrictions.eq("t.tag", busca);
        Criterion c2 = Restrictions.ilike("i.titulo", busca, MatchMode.ANYWHERE);
        Criterion c3 = Restrictions.or(c1, c2);
        c.add(c3);
        
        //c.setProjection(Projections.groupProperty("i.id"));

        return c.list();
    }

Com este codigo gera o seguinte sql:

select
        this_.id as id0_1_,
        this_.altura as altura0_1_,
        this_.caminho as caminho0_1_,
        this_.formato as formato0_1_,
        this_.largura as largura0_1_,
        this_.tamanho as tamanho0_1_,
        this_.titulo as titulo0_1_,
        tags3_.imagens_id as imagens1_,
        t1_.tag as tags2_,
        t1_.tag as tag1_0_ 
    from
        Imagem this_ 
    inner join
        Imagem_Tag tags3_ 
            on this_.id=tags3_.imagens_id 
    inner join
        Tag t1_ 
            on tags3_.tags_tag=t1_.tag 
    where
        (
            t1_.tag=? 
            or lower(this_.titulo) like ?
        )

e quando entao descomento o c.setProjection(Projections.groupProperty("i.id"));
para agrupar por id... o sql fica assim:

select
        this_.id as y0_ 
    from
        Imagem this_ 
    inner join
        Imagem_Tag tags3_ 
            on this_.id=tags3_.imagens_id 
    inner join
        Tag t1_ 
            on tags3_.tags_tag=t1_.tag 
    where
        (
            t1_.tag=? 
            or lower(this_.titulo) like ?
        ) 
    group by
        this_.id

Todos os outros atributos antes que ficavam no select somem, e entao só me é retornado o campo ID..
será que estou usando de modo correto o groupProperty ?

G

O problema acontece porque o group by só pode ser usado quando vc utiliza alguma função ( como SUN, COUNT, etc… )

Com qual objetivo você está tentando agrupar os dados?

V

O caso é o seguinte a busca é feita ou pela tag ou por parte do titulo
ai em casos q a encontra resultados no titulo e nas tags
a linha se repete (menos na coluna tag)

queria agrupar todos pelo id!

para nao listar imagens repetidas na busca!

com o codigo sql funciona direitinho… so nao consigo implementar em criteria

select * from Imagem,Imagem_Tag where id = imagens_id and ( tags_tag like ‘’ or titulo like ‘%%’ ) group by id

G

Se você não quer repetição, use DISTINCT

c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
V

Aeee!
Valeu funcionou =D

Criado 26 de junho de 2008
Ultima resposta 27 de jun. de 2008
Respostas 5
Participantes 2