Problemas na consulta com hibernate + restriction

3 respostas
Vendramini87

Olá,

Tenho o relacionamento de:

Departamento.java

@OneToMany(targetEntity=Cargo.class, mappedBy="departamento", fetch=FetchType.EAGER)
@JoinColumn(name="fk_depId")
private List<Cargo> cargos;
Cargo.java

@ManyToOne(targetEntity=Departamento.class)
@JoinColumn(name="fk_depId")
@ForeignKey(name="dep_id")
private Departamento departamento;

@ManyToOne(targetEntity=Empresa.class)
@JoinColumn(name="fk_empId")
@ForeignKey(name="emp_id")
private Empresa empresa;

O que preciso fazer é: uma query em todos departamentos onde a empresa do cargo seja DIFERENTE de “terceiro”. Estou tentando o seguinte:

Criteria crit = getSession().createCriteria(getPersistentClass());
crit.createAlias("cargos", "c");
crit.createAlias("c.empresa", "e");
crit.add(Restrictions.ne("e.apelido", "terceiro")).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);;
return (List<Departamento>) crit.list();

Mas não tem efeito algum. Sugestões? :slight_smile:

Obrigado,
André Vendramini

3 Respostas

Vendramini87

Olá,

Testei outras formas de query, como filtrar pelo alias “c” (por exemplo, Restrictions.eq("c.id"m 5L)) e funciona. O problema está ao tentar filtrar pela Empresa do Cargo. Estou com FetchType.EAGER.

Alguém tem alguma sugestão?

Obrigado,
André Vendramini

Vendramini87

Pessoal, alguém consegue me dar uma ajudazinha?

Sou programador actionscript e as vezes que trabalhei com banco, sempre fiz as queries na mão. Como estou usando hibernate agora, travo em uns problemas bobinhos, por falta de conhecimento do hibernate. Se fosse SQL eu conseguiria fazer.

Obrigado,
André Vendramini

Vendramini87

Olá,

Desculpem pelo up no post, mas preciso mesmo de uma ajuda.

Não há erros na minha query. Ele simplesmente ignora meus alias e a Restriction para e.apelido.
Quando executo essa consulta, me retorna a lista completa, incluindo as empresas “terceiro”.

Meu teste:

public class DepartamentoTest extends TestCase
{
   public void testDepartamentoSemTerceiro()
   {
      List<Departamento> dptos = new Departamento().listarPorAgencia();
      for (Departamento departamento : dptos)
      {
         List<Recurso> cargos = departamento.getCargos();
         for (Recurso recurso : cargos)
         {
            System.out.println(departamento.getId() + " " + departamento.getNome() + " >>>> " + recurso.getNome() + " >>>> " + recurso.getEmpresa().getApelido() + " " + recurso.getId());
         }
      }
   }
}

O método “listarPorAgencia”:

public List<Departamento> listarPorAgencia()
      {
         Criteria crit = getSession().createCriteria(getPersistentClass()).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
         crit.createAlias("cargos", "c");
         crit.createAlias("c.empresa", "e");
         crit.add(Restrictions.ne("e.apelido", "terceiro")).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
         return (List<Departamento>) crit.list();
      }

O trace:

Vêem que me retorna a lista completa incluindo “terceiro”? Preciso tirá-lo da lista.

Obrigado,
André Vendramini

Criado 3 de março de 2010
Ultima resposta 10 de mar. de 2010
Respostas 3
Participantes 1