Consulta não retorna dados

6 respostas
lucianoBorges

Olá Pessoal,

Estou com a seguinte dúvida. Tenho um objeto chamado “Register” que tem um atributo “User”, que por sua vez tem um atributo “Profile”. Gostaria de listar todos os “Registers” que tenham “Users” que possuam o campo “level” - atributo Integer de “Profile” - menor que um determinado valor. O problema é que a consulta em “Registers” não ocorre. Vi isso pelos logs do hibernate no console do Eclipse.

Estou criando o objeto Criteria da da seguinte forma:

Criteria criteria = session.createCriteria(new Register().getClass());
criteria.add(Restrictions.le("user.profile.level", 4));

Não sei se é relevante, mas o mapeamento entre “Register” e “User” está como EAGER, bem como o mapeamento entre “User” e “Profile”

Desde já agradeço qualquer ajuda!

Luciano Borges

6 Respostas

C

lucianoBorges:
Olá Pessoal,

Estou com a seguinte dúvida. Tenho um objeto chamado “Register” que tem um atributo “User”, que por sua vez tem um atributo “Profile”. Gostaria de listar todos os “Registers” que tenham “Users” que possuam o campo “level” - atributo Integer de “Profile” - menor que um determinado valor. O problema é que a consulta em “Registers” não ocorre. Vi isso pelos logs do hibernate no console do Eclipse.

Estou criando o objeto Criteria da da seguinte forma:

Criteria criteria = session.createCriteria(new Register().getClass());
criteria.add(Restrictions.le("user.profile.level", 4));

Não sei se é relevante, mas o mapeamento entre “Register” e “User” está como EAGER, bem como o mapeamento entre “User” e “Profile”

Desde já agradeço qualquer ajuda!

Luciano Borges

Tenta assim:

session.createCriteria(Register.class, "r").createAlias("User", "u")
					.createAlias("Profile", "p")
					.add(Restrictions.le("p.level",4)).list();
lucianoBorges

c0nf1ck:
lucianoBorges:
Olá Pessoal,

Estou com a seguinte dúvida. Tenho um objeto chamado “Register” que tem um atributo “User”, que por sua vez tem um atributo “Profile”. Gostaria de listar todos os “Registers” que tenham “Users” que possuam o campo “level” - atributo Integer de “Profile” - menor que um determinado valor. O problema é que a consulta em “Registers” não ocorre. Vi isso pelos logs do hibernate no console do Eclipse.

Estou criando o objeto Criteria da da seguinte forma:

Criteria criteria = session.createCriteria(new Register().getClass());
criteria.add(Restrictions.le("user.profile.level", 4));

Não sei se é relevante, mas o mapeamento entre “Register” e “User” está como EAGER, bem como o mapeamento entre “User” e “Profile”

Desde já agradeço qualquer ajuda!

Luciano Borges

Tenta assim:

session.createCriteria(Register.class, "r").createAlias("User", "u") .createAlias("Profile", "p") .add(Restrictions.le("p.level",4)).list();

Olá,

Tentei da forma como me disse e não funcionou. No log de saída do Hibernate continua não sendo exibida uma consulta que tenha como “from” o objeto “Register”.

Continuo com o problema. De qualquer forma, muito obrigado pela ajuda!

drsmachado

Como está a saída do SQL gerado pelo Criteria?

lucianoBorges

Olá,

A saída é a seguinte:

Hibernate: 
    /* criteria query */ select
        this_.id as id73_1_,
        this_.login as login73_1_,
        this_.profile_id as profile6_73_1_,
        profile2_.id as id72_0_,
        profile2_.level as level72_0_,
    from
        users this_ 
    left outer join
        profile profile2_ 
            on this_.profile_id=profile2_.id 
    order by
        this_.name asc

O estranho, mesmo eu tendo criado um objeto Criteria com a classe Register, é que não ocorre nenhuma consulta nesse objeto, ou seja, não há saída no console que tenha algo como “from register”.

Abaixo segue o código que resultou na saída citada acima:

Criteria criteria = session.createCriteria(Register.class, "r");
criteria.createAlias("User", "u");
criteria.createAlias("Profile", "p");
criteria.add(Restrictions.le("p.level", user.getProfile().getLevel()));

Obrigado

drsmachado

Camarada, creio que só usar o createAlias não seja suficiente. Talvez seja preciso informar o JoinType para que o criteria consiga trabalhar corretamente.

Veja este blog, creio que pode te ajudar

lucianoBorges

Olá,

Amigo, em primeiro lugar gostaria de agradecer muito a sua ajuda! Já nas primeiras linhas do blog li a solução, testei e funcionou!

Só para registrar, caso alguém busque por um problema parecido, o meu erro foi o seguinte: o primeiro parâmetro do método “createAlias” é o nome do atributo e não o nome da classe do atributo. Ou seja, eu estava colocando “User” ao invés de “user” - que é realmente o nome do atributo. Segue o trecho de código corrigido:

Criteria criteria = session.createCriteria(Register.class);
criteria.createAlias("user", "u");	
criteria.createAlias("u.profile", "p");
criteria.add(Restrictions.le("p.level", user.getProfile().getLevel()));

Ou seja, criei alias para o atributo “user” em “Register” e também criei alias para o atributo “profile” em “User”

Agradeço também ao colega “c0nf1ck” que postou a primeira resposta.

Valeu gurizada, grande abraço!

Criado 15 de agosto de 2012
Ultima resposta 17 de ago. de 2012
Respostas 6
Participantes 3