java - two - hibernate criteria mkyong
Criterio de hibernación ¿Mecanismo límite? (5)
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 de LIMIT, puede activar su registro de SQL.
El soporte de Hibernate Criteria proporciona un método setMaxResults()
para limitar los resultados devueltos desde la base de datos.
No puedo encontrar ninguna respuesta a esto en su documentación. ¿Cómo se implementa esto? ¿Está consultando todo el conjunto de resultados y luego devuelve solo el número de solicitud? ¿O está realmente limitando la consulta en el extremo de la base de datos (piense en la palabra clave LIMIT como en mySql)?
Esto es importante porque si una consulta podría potencialmente setMaxResults()
muchos resultados, realmente necesito saber si el setMaxResults()
todavía consultará todas las filas en la base de datos (lo que sería malo).
Además, si realmente está limitando el número de filas en la base de datos, ¿cómo está logrando esta db cruzada? (Ya que no creo que todos los rdbms sean compatibles con una funcionalidad LIMIT como mySql).
Hibernate le pide a la base de datos que limite los resultados devueltos por la consulta. Lo hace a través del dialecto, que utiliza cualquier mecanismo de base de datos específico para hacerlo (de modo que para SQL Server hará algo como "seleccionar top n * de la tabla", Oracle hará "select * de la tabla donde rownum <n ", MySQL hará" seleccione * de la tabla límite n ", etc.). Entonces simplemente devuelve lo que devuelve la base de datos.
La clase org.hibernate.dialect.Dialect
contiene un método llamado org.hibernate.dialect.Dialect
supportsLimit()
. Si las subclases de dialecto anulan este método, pueden implementar el manejo del límite de fila de manera nativa a su base de datos. Puede ver desde dónde se llama a este código en la clase org.hibernate.loader.Loader que tiene un método titulado prepareQueryStatement
, solo busque el límite de palabras.
Sin embargo, si el dialecto no es compatible con esta función, hay un control duro en el iterador ResultSet
que garantiza 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 el Loader
también.
Sé que la pregunta es un poco vieja. Pero sí, setMaxResults()
está realmente limitando el número de filas en el extremo de la base de datos.
Si realmente observa su salida de Hibernate SQL, puede encontrar la siguiente declaración de SQL que se ha agregado a su consulta.
limit ?
Uso tanto Hibernate como Hibernate Search y sin mirar la implementación subyacente puedo decirles que definitivamente no devuelven todos los resultados. He implementado la misma consulta devolviendo todos los resultados y luego la cambié para establecer el primer resultado y los resultados máximos (para implementar la paginación) y las ganancias de rendimiento fueron enormes.
Es probable que usen dialectos SQL específicos para esto, por ejemplo, LIMIT en MySQL, ROWNUM en Oracle. El administrador de su entidad es consciente del dialecto que está utilizando, por lo que es sencillo.
Finalmente, si realmente desea comprobar qué está produciendo SQL Hibernate para esta consulta, simplemente configure la propiedad "show_sql" en true cuando cree su entidad / fábrica y escupe todo el SQL que está ejecutando en la consola.