Dúvida com IN em criteria

35 views
Skip to first unread message

Vinicius Rabelo

unread,
Jun 30, 2010, 10:55:14 PM6/30/10
to Hibernate Brasil
Olá pessoal,

Tenho uma tela de pesquisa de empresa onde o usuário pode especificar
diversos critérios para pesquisar...

A empresa possui um relacionamento NxN com Área de atuação, caso o
usuário informe a área de atuação como critério para pesquisa, devo
trazer todas as empresa onde o id da empresa esteja nesta tabela de
relacionamento e o nome da área de atuação seja o informado pelo
usuário...
Estou com problemas para criar esse IN com criteria, pois fiz da
seguinte forma (visão geral):

Criteria criteriaEmpresa = createCriteria(Empresa.class);

if(porAreaAtuacao){
Criteria criteriaEmpresaAreaAtuacao =
createCriteria(EmpresaAreaAtuacao.class);
criteriaEmpresaAreaAtuacao.createAlias("areaAtuacao",
"areaAtuacao");
criteriaEmpresaAreaAtuacao.createAlias("empresa", "empresa");

criteriaEmpresaAreaAtuacao.setProjections(Projections.property("empresa.id"));
criteriaEmpresaAreaAtuacao.add(Restrictions.eq("nome",
areaAtuacaoInformadaPeloUsu));

criteriaEmpresa.add(Restrictions.in("id",
criteriaEmpresaAreaAtuacao.list()));
}


O problema é que se criteriaEmpresaAreaAtuacao.list() retornar uma
lista vazia ocorre errro, pois na hora que o hibernate monta a quer
fica algo como: empresa.id IN ();
Não posso simplesmente fazer uma verificação se
criteriaEmpresaAreaAtuacao.list() está retornando uma lista vazia
antes de utilizar no IN porque neste caso não deveria trazer nenhuma
empresa...

Qual a forma correta de fazer este in?

Davi

unread,
Jul 2, 2010, 8:48:42 PM7/2/10
to Hibernate Brasil
Vinicius,
dependendo de como vc está utilizando esse método que possui o
criteria, não
vejo pq vc não pode verificar se o criteriaEmpresaAreaAtuacao.list()
retorna uma lista vazia,
pq já que não era p retornar nenhuma empresa para quê continuar essa
criteria?...
Se o método retornar uma lista de Empresa não vejo pq retorna uma
lista vazia ou mesmo nula
e quem fez a chamada p esse método trata o resto da regra de negócio
conforme essa lista não
tenha retorno algum. Posso não ter entendido bem seu problema de
kualker forma
analisa essa situação melhor,mas às vezes uma solução mais simples já
pode ser o bastante.

Att

Davi Gomes da Costa
Desenvolvedor

WebSite: http://www.ivia.com.br

IVIA ® Inovação e Tecnologia
[ CMMI 2 + ISO 9001:2008 + MPS.BR E ]

Leonardo

unread,
Jul 3, 2010, 12:11:05 PM7/3/10
to hibernat...@googlegroups.com
Pq vc na usa HQL?


From Ipod

Em 30/06/2010, às 23:55, Vinicius Rabelo <vinici...@gmail.com>
escreveu:

> --
> Você está recebendo esta mensagem porque se inscreveu no grupo "Hibe
> rnate Brasil" dos Grupos do Google.
> Para postar neste grupo, envie um e-mail para hibernat...@googlegroups.com
> .
> Para cancelar a inscrição nesse grupo, envie um e-mail para hibernate-brasil+unsubscribe@googlegroups.c
> om.
> Para obter mais opções, visite esse grupo em http://groups.google.com/group/hibernate-brasil?hl=pt-
> BR.
>

Vinicius Rabelo

unread,
Jul 2, 2010, 10:15:54 PM7/2/10
to Hibernate Brasil
Olá Davi,
Obrigado pela intenção em ajudar...

Nada me empede de fazer dessa forma... ficaria algo como:

public List<Empresa> pesquisar(FiltroEmpresa filtro){
...

if(porAreaAtuacao){
Criteria criteriaEmpresaAreaAtuacao =
createCriteria(EmpresaAreaAtuacao.class);
criteriaEmpresaAreaAtuacao.createAlias("areaAtuacao",
"areaAtuacao");
criteriaEmpresaAreaAtuacao.createAlias("empresa",
"empresa");


criteriaEmpresaAreaAtuacao.setProjections(Projections.property("empresa.id"­));
criteriaEmpresaAreaAtuacao.add(Restrictions.eq("nome",
areaAtuacaoInformadaPeloUsu));

List listEmpresaAreaAtuacao =
criteriaEmpresaAreaAtuacao.list();
if(listEmpresaAreaAtuacao.isEmpty){
criteriaEmpresa.add(Restrictions.in("id",
listEmpresaAreaAtuacao));
} else {
return new ArrayList();
}
}
...
Continua com a criteria
return criteriaEmpresa.list();

}

Mas estou perguntando porque acho que deve ter uma forma "correta" de
fazer isso, assim como podemos fazer com HQL e não temos esse erro
caso a lista seja vazia..

Grato,

Vinícius

Vinicius Rabelo

unread,
Jul 4, 2010, 10:55:48 AM7/4/10
to Hibernate Brasil
Olá Leonardo,

Posso utilizar HQL sem problemas, mas como é um query complexa e já
está pronta com criteria não queria mecher...
Mas caso não encontre uma solução vou refazer com HQL mesmo...

Obrigado,

Vinícius
> > [ CMMI 2 + ISO 9001:2008 + MPS.BR E ]- Ocultar texto das mensagens anteriores -
>
> - Mostrar texto das mensagens anteriores -
Reply all
Reply to author
Forward
0 new messages