En Hibernate 3, ¿hay alguna manera de hacer el equivalente del siguiente límite de MySQL en HQL?
select * from a_table order by a_table_column desc limit 0, 20;
No quiero usar setMaxResults si es posible. Esto definitivamente fue posible en la versión anterior de Hibernate / HQL, pero parece haber desaparecido.
java
hibernate
hql
hibernate3
stevedbrown
fuente
fuente
Hibernate-5.0.12
. ¿Todavía no está disponible? Sería realmente pesado obtener un millón de registros y luego aplicar el filtrosetMaxResults
sobre él, como notó @Rachel en la respuesta de @skaffman.Respuestas:
Esto fue publicado en el foro de Hibernate hace unos años cuando se le preguntó por qué esto funcionó en Hibernate 2 pero no en Hibernate 3:
Entonces, si funcionó en Hibernate 2, parece que fue por coincidencia, en lugar de por diseño. Creo que esto se debió a que el analizador HQL de Hibernate 2 reemplazaría los bits de la consulta que reconoció como HQL, y dejaría el resto como estaba, para que pueda colarse en un SQL nativo. Hibernate 3, sin embargo, tiene un analizador AST HQL adecuado, y es mucho menos indulgente.
Creo que
Query.setMaxResults()
realmente es tu única opción.fuente
setMaxResults
lo que tomaría un número limitado de filas de resultados del conjunto de resultados y se lo mostraría al usuario, en mi caso tengo 3 millones de registros que se consultan y luego estoy llamando a setMaxResults para establecer 50 registros pero no quiero hacer eso, mientras que la consulta en sí quiero consultar 50 registros, ¿hay alguna manera de hacerlo?setMaxResults
hibernate agregará lalimit
parte a la consulta. No obtendrá todos los resultados. Puede verificar la consulta que produce habilitando:<property name="show_sql">true</property>
fuente
setFirstResult
realidad se menciona en esta respuesta, mientras que aquí y en otros lugares solo dicensetMaxResults
esto ysetMaxResults
aquello sin mencionar cómo establecer el desplazamiento.Si no desea usar
setMaxResults()
elQuery
objeto, siempre puede volver a usar SQL normal.fuente
Si no desea usar setMaxResults, también puede usar Query.scroll en lugar de list y buscar las filas que desee. Útil para paginación por ejemplo.
fuente
setMaxResults()
primero carga cada registro en la memoria y luego crea una sublista, que cuando hay cientos de miles o más registros bloquea el servidor, porque no tiene memoria. Sin embargo, podría pasar de una consulta con tipo JPA a una consulta de HibernateQueryImpl hibernateQuery = query.unwrap(QueryImpl.class)
y luego podría usar elscroll()
método como usted sugirió.Puede usar fácilmente la paginación para esto.
tienes que pasar
new PageRequest(0, 1)
para buscar registros y de la lista buscar el primer registro.fuente
Los
setFirstResult
ysetMaxResults
Query
métodosPara un JPA e Hibernate
Query
, elsetFirstResult
método es el equivalente deOFFSET
, y elsetMaxResults
método es el equivalente de LIMIT:La
LimitHandler
abstraccionHibernate
LimitHandler
define la lógica de paginación específica de la base de datos y, como se ilustra en el siguiente diagrama, Hibernate admite muchas opciones de paginación específicas de la base de datos:Ahora, dependiendo del sistema de base de datos relacional subyacente que esté utilizando, la consulta JPQL anterior utilizará la sintaxis de paginación adecuada.
MySQL
PostgreSQL
servidor SQL
Oráculo
La ventaja de usar
setFirstResult
ysetMaxResults
es que Hibernate puede generar la sintaxis de paginación específica de la base de datos para cualquier base de datos relacional compatible.Y no está limitado únicamente a consultas JPQL. Puede usar el método
setFirstResult
ysetMaxResults
siete para consultas SQL nativas.Consultas SQL nativas
No tiene que codificar la paginación específica de la base de datos cuando utiliza consultas SQL nativas. Hibernate puede agregar eso a sus consultas.
Entonces, si está ejecutando esta consulta SQL en PostgreSQL:
Hibernate lo transformará de la siguiente manera:
¿Guay, verdad?
Más allá de la paginación basada en SQL
La paginación es buena cuando puede indexar los criterios de filtrado y clasificación. Si sus requisitos de paginación implican un filtrado dinámico, es un enfoque mucho mejor utilizar una solución de índice invertido, como ElasticSearch.
Mira este artículo para más detalles.
fuente
String hql = "select userName from AccountInfo order by points desc 5";
Esto funcionó para mí sin usar
setmaxResults();
Solo proporcione el valor máximo en el último (en este caso 5) sin usar la palabra clave
limit
. :PAGSfuente
Mi observación es que incluso si tiene un límite en la HQL (hibernate 3.x), causará un error de análisis o simplemente se ignorará. (si tiene orden por + desc / asc antes del límite, se ignorará, si no tiene desc / asc antes del límite, causará un error de análisis)
fuente
Si puede administrar un límite en este modo
Este es un código realmente simple para manejar un límite o una lista.
fuente
fuente
Necesita escribir una consulta nativa, consulte esto .
fuente
Puedes usar la consulta a continuación
fuente
El fragmento a continuación se utiliza para realizar consultas de límite utilizando HQL.
Puede obtener la aplicación de demostración en este enlace .
fuente
fuente