Есть ли переносимый способ иметь семантику "SELECT FIRST 10 * FROM T"?
Я хочу читать данные в блоках из 10 000 записей из базы данных.
Я нашел пределы результатов в википедии, и кажется очевидным, что это невозможно сделать с помощью sql портативным способом.
Другим подходом может быть JdbcTemplate, который предлагает множество методов для запросов, но как я могу решить, что достаточно строк, которые были прочитаны. Через обратные вызовы, такие как RowMapper и ResultSetExtractor, не может быть указано, что достаточно данных было прочитано.
EDIT: Я искал решение для JdbcTemplate
Этот post предлагает использовать setMaxRows, который я упустил.
Ответы
Ответ 1
Grab Hibernate или JPA. Оба знакомы с различными диалектами базы данных и будут обрабатывать неприятные особенности БД под капотами прозрачно.
В Hibernate вы можете разбивать страницы на Criteria#setFirstResult()
и Criteria#setMaxResults()
. Например.
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();
В JPA вы можете сделать с помощью Query#setFirstResult()
и 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();
Ответ 2
Существует стандартный синтаксис ANSI из SQL:2008:
SELECT t.*
FROM TABLE t
FETCH FIRST 10 ROWS ONLY
... но в настоящее время он не поддерживается в большинстве баз данных.
Ответ 3
Нет никакого переносимого способа сделать это на простом SQL, потому что разные SQL-двигатели используют для этого разные синтаксисы.
Используйте уровень абстракции базы данных или DBAL.
http://en.wikipedia.org/wiki/Database_abstraction_layer
http://jonasbandi.net/wiki/index.php/ORM_Solutions_for_Java
Ответ 4
Если вам нужен переносимый способ, вам нужно переместить слой абстракции, так как нет портативного SQL-пути (а не того, что базы данных фактически реализуют в любом случае) - и использовать ORM-карты, например, hibernate.
Если вам нужен сырой JDBC, вам придется написать конкретный SQL для конкретной базы данных eache, что часто бывает так, как писать 100% -ный portabl SQL довольно сложно во всех, кроме тривиальных случаях.
Последнее средство - запустить запрос без каких-либо ограничений и просто перебрать 10 первых результатов, которые вы вернетесь - хотя это не влияет на возможности базы данных, и было бы неплохо, если ваш запрос приводит к множеству строк.
Ответ 5
Нет. Вот почему слои абстракции базы данных, такие как Hibernate, содержат диалекты SQL, в которых вы выбираете тот, который будет использоваться с вашей базой данных.