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