tengo otra solución genérica, que debería funcionar para cada consulta Criterios:
utilizar un comentario estándar y un interceptor de Hibernate cambiar el SQL definitiva a la base de datos.
(Lo usé con Hibernate 3.3, pero debería ser utilizable para cada versión, el registro del Interceptor puede ser diferente.)
En su código de consulta utilización:
criteria.setComment("$HINT$ push_pred(viewAlias)");
Escribir un interceptor para cambiar a texto SQL (éste utiliza commons.lang3.StringUtils):
public class HibernateEntityInterceptor extends EmptyInterceptor {
@Override
public String onPrepareStatement(String sql) {
if (sql.startsWith("/* $HINT$")) {
String hintText = StringUtils.substringBetween(sql, "/* $HINT$", "*/");
sql = sql.replaceFirst("select ", "select /*+" + hintText + "*/ ");
}
return sql;
}
Por encima es para Oracle, pero debe ser fácilmente ajustable para cada DBMS.
Tal vez puedas/deberías crear una constante para el marcador "$ HINT $".
También se debe realizar el registro (para que pueda ver fácilmente la llamada correcta del Interceptor), lo dejé arriba para simplificar.
El interceptor debe estar registrado. En la primavera de esto se hace en applicationContext.xml
:
<bean id="entityListener" class="your.package.HibernateEntityInterceptor"/>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="entityInterceptor" ref="entityListener"/>
[...]
O (copia de los Hibernate 3.3 docs): interceptor
Un ámbito de sesión se especifica cuando se abre una sesión usando uno de los SessionFactory sobrecargada Métodos .openSession() aceptando un Interceptor.
Session session = sf.openSession(new HibernateEntityInterceptor());
Un interceptor SessionFactory de ámbito se ha registrado en el objeto de configuración antes de la construcción de la SessionFactory. A menos que se abra una sesión especificando explícitamente el interceptor que se utilizará, el interceptor suministrado se aplicará a todas las sesiones abiertas desde esa SessionFactory. Los interceptores con alcance SessionFactory deben ser seguros . Asegúrese de no almacenar estados específicos de la sesión, ya que sesiones múltiples usarán este interceptor de manera concurrente.
new Configuration().setInterceptor(new HibernateEntityInterceptor());
el resultado será de hecho con la cara del usuario. –
la consulta en sí es correcta tal como es. dado que se genera dinámicamente, no se puede optimizar manualmente, es diferente para cada consulta de búsqueda. –