2011-08-31 13 views
17

El soporte de criterios de Hibernate proporciona un método setMaxResults() para limitar los resultados devueltos por el db.Criterios de Hibernación ¿Mecanismo de límite?

No encuentro ninguna respuesta a esto en su documentación. ¿Cómo se implementa esto? ¿Está consultando todo el conjunto de resultados y luego solo devuelve el número de solicitud? ¿O está realmente limitando la consulta en el final de la base de datos (piense en la palabra clave LIMIT como en mySql).

Esto es importante porque si una consulta podría devolver muchos resultados, realmente necesito saber si el setMaxResults() seguirá consultando todas las filas de la base de datos (lo que sería malo).

Además, si realmente limita el número de filas en el final de la base de datos, ¿cómo está logrando este cross-db (ya que no creo que cada rdbms sea compatible con una funcionalidad LIMIT como mySql).

Respuesta

0

HQL no admite una limitación dentro de una consulta como en SQL, solo el setMaxResults() que también encontró.

Para saber si transforma el setMaxResults() en una consulta LIMIT, puede activar el registro de SQL.

11

Hibernate solicita a la base de datos que limite los resultados devueltos por la consulta. Hace esto a través del dialecto, que usa cualquier mecanismo específico de base de datos para hacerlo (así que para SQL Server hará algo así como "seleccionar top n * de la tabla", Oracle hará "select * from table donde rownum < n ", MySQL hará" seleccionar * del límite de tabla n ", etc.). Luego solo devuelve lo que devuelve la base de datos.

+0

Intersting. Entonces, ¿por qué crees que no proporcionaron una forma de limitar el uso de HQL si pueden transformarse al dialecto específico dado un criterio setMaxResults? – john

+0

eche un vistazo en http://stackoverflow.com/questions/1239723/how-do-you-do-a-limit-query-in-hql – Ritesh

+0

Esto puede proporcionar cierta claridad: http://stackoverflow.com/questions/1239723/how-do-you-do-a-limit-query-in-hql.Según entiendo, todo se reduce a mantener la base de datos de partes HQL independiente, las características específicas del dialecto se realizan a través de llamadas a métodos adicionales como setMaxResults – brent777

2

Uso tanto Hibernate como Hibernate Search y sin mirar la implementación subyacente puedo decir que definitivamente no devuelven todos los resultados. Implementé la misma consulta devolviendo todos los resultados y luego la cambié para establecer el primer resultado y los máximos resultados (para implementar la paginación) y las ganancias de rendimiento fueron masivas.

Es probable que usen SQL específico del dialecto para esto, p. LIMITE en MySQL, ROWNUM en Oracle. El administrador de su entidad conoce el dialecto que está utilizando, así que esto es simple.

Por último, si realmente desea comprobar qué SQL Hibernate está produciendo para esta consulta, simplemente establezca la propiedad "show_sql" en true cuando cree su entidad manager/factory y escuche todo el SQL que está ejecutando en la consola .

5

La clase org.hibernate.dialect.Dialect contiene un método llamado supportsLimit(). Si las subclases dialectales anulan este método, pueden implementar el manejo del límite de filas de una manera nativa de su sabor de base de datos. Puede ver de dónde se llama este código en la clase org.hibernate.loader.Loader que tiene un método llamado prepareQueryStatement, simplemente busque la palabra límite.

Sin embargo, si el dialecto no es compatible con esta característica, existe una verificación estricta contra el iterador ResultSet que asegura que los resultados del objeto Java (entidad) dejarán de construirse cuando se alcance el límite. Este código también se encuentra en Loader también.

Cuestiones relacionadas