La inyección SQL no debería ser un riesgo cuando use Hibernate, siempre y cuando lo esté utilizando correctamente.
Las consultas de hibernación se escriben en HQL (lenguaje de consulta similar a SQL de Hibernate) o se implementan utilizando la API de criterios orientada a objetos.
HQL es el más común y más recomendado. Normalmente, usted podría escribir una consulta HQL como esto:
Subscription sub = (Subscription) sessionFactory.getCurrentSession()
.createQuery("from Subscription sub where sub.verification = :verification")
.setString("verification", verification)
.uniqueResult();
De esta forma usted está protegido de la inyección de SQL, ya que Hibernate pasa en la cadena como un parámetro; no puede ser interpretado como parte del SQL.
Sin embargo, si te portas mal una escritura de una consulta como esta ...
Subscription sub = (Subscription) sessionFactory.getCurrentSession()
.createQuery("from Subscription sub where sub.verification = '" + verification + "'")
.uniqueResult();
... entonces no está protegido de la inyección de SQL. Sin embargo, nunca deberías escribir consultas como esta. No creo que ningún framework lo proteja si agrega cadenas a sus consultas.
Finalmente, si utiliza la API de criterios de Hibernate, queda automáticamente protegido contra la inyección de SQL; Debido a que Hibernate crea la consulta subyacente cuando usa la API de Criteria, lo hace de una manera que impide la inyección de SQL.