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