06 maio 2008

Validações do tipo "existe algum" no hibernate.

Mais um perrengue daqueles que enchem o saco. Passei algumas horas (na verdade, 4 horas) pra achar uma maneira boa e simples de se fazer esse tipo de validação. Eu precisava checar se determinado servidor público estava alocado em alguma escala de trabalho para fins de regra de negócio. O grafo de entidades para uma escala de trabalho era relativamente complexo, e um criteria via hibernate era relativamente trabalhoso e complexo de se fazer. Além disso, valeria a pena fazer um criteria, apenas para algo desse tipo?
if (! listaEscalaTrabalho.isEmpty()) {
  throw new ApplicationException("messageKey");
}
O experiente Marco Antônio, colega de trabalho, tinha me sugerido fazer uma query direta no banco de dados. Não retornaria objeto algum, apenas a quantidade de escalas em que tal servidor estivesse alocado. Pode parecer um jeito arcaico, mas não, isso é GENIAL. Pense no seguinte: traz apenas um inteiro, não enche o cache do Hibernate com objetos sem necessidade, e além do mais, é rápida.
public boolean verificarServidorAlocado(
     ServidorPublico servidorPublico) {
  StringBuffer buf = new StringBuffer();
  buf.append("select count(*)...");
  ...

  Integer result = (Integer) HibernateUtil.
     getSession().createSQLQuery(buf.toString()).
     uniqueResult();

  return (result > 0);
}
Claro que a melhor maneira para resolver este tipo de problema seria usar um HQL, mas como eu não sei usar isso ainda, nada como montar a query na mão, não é verdade? Veja também: HQL - The Hibernate Query Language
Comentários
0 Comentários

0 comments:

Postar um comentário

Regras são chatas, mas...

- Seu comentário precisa ter relação com o assunto do post;
- Em hipótese alguma faça propaganda de outros blogs ou sites;
- Não inclua links desnecessários no conteúdo do seu comentário;
- Se quiser deixar sua URL, comente usando a opção OpenID;
- CAIXA ALTA, miguxês ou erros de ortografia não serão tolerados;
- Ofensas pessoais, ameaças e xingamentos não são permitidos;