journaldev ejemplo java sql spring jdbc

java - ejemplo - ¿Hay una forma portátil de tener "SELECT FIRST 10*FROM T" semántica?



spring jdbc maven (5)

Quiero leer datos en bloques de, digamos, 10k registros de una base de datos.

Encontré Límites de resultados en wikipedia y parece obvio que esto no se puede hacer con sql de manera portátil.

Otro enfoque podría ser JdbcTemplate, que ofrece muchos métodos para consultas, pero ¿cómo podría decidir que se hayan leído suficientes filas? A través de las devoluciones de llamada como RowMapper y ResultSetExtractor, no se puede indicar que se han leído suficientes datos.

EDITAR: estaba buscando una solución para JdbcTemplate. Esta publicación sugiere usar setMaxRows que había pasado por alto.


Hay una sintaxis estándar ANSI de SQL: 2008 :

SELECT t.* FROM TABLE t FETCH FIRST 10 ROWS ONLY

... pero no es compatible con la mayoría de las bases de datos en este momento.



No. Es por eso que las capas de abstracción de bases de datos como Hibernate contienen dialectos SQL donde eliges el que usarás con tu base de datos.


Si desea una forma portátil, debe pasar a una capa de abstracción, ya que no hay una forma portátil de SQL (no una que las bases de datos realmente implementen de todos modos), y utilice mapeadores ORM como, por ejemplo, hibernar.

Si necesita JDBC sin formato, tendrá que escribir SQL específico para una base de datos específica eache, que a menudo es el caso, ya que escribir 100% portabl SQL es bastante difícil en todos los casos menos triviales.

El último recurso es ejecutar la consulta sin restricciones y simplemente repetir los primeros 10 resultados que obtenga, aunque esto no aprovecha las capacidades de la base de datos y sería bastante malo si la consulta resulta en muchas filas.


Toma Hibernate o JPA . Ambos están familiarizados con varios dialectos de bases de datos y manejarán las desagradables especificaciones de DB bajo los capós transparentemente.

En Hibernate puede paginar usando Criteria#setFirstResult() y Criteria#setMaxResults() . P.ej

List users = session.createCriteria(User.class) .addOrder(Order.asc("id")) .setFirstResult(0) // Index of first row to be retrieved. .setMaxResults(10) // Amount of rows to be retrieved. .list();

En JPA puede hacer lo mismo utilizando Query#setFirstResult() y Query#setMaxResults() .

List users = em.createQuery("SELECT u FROM User u ORDER BY u.id"); .setFirstResult(0) // Index of first row to be retrieved. .setMaxResults(10) // Amount of rows to be retrieved. .getResultList();