Есть ли переносимый способ иметь семантику "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

... но в настоящее время он не поддерживается в большинстве баз данных.

Ответ 4

Если вам нужен переносимый способ, вам нужно переместить слой абстракции, так как нет портативного SQL-пути (а не того, что базы данных фактически реализуют в любом случае) - и использовать ORM-карты, например, hibernate.

Если вам нужен сырой JDBC, вам придется написать конкретный SQL для конкретной базы данных eache, что часто бывает так, как писать 100% -ный portabl SQL довольно сложно во всех, кроме тривиальных случаях.

Последнее средство - запустить запрос без каких-либо ограничений и просто перебрать 10 первых результатов, которые вы вернетесь - хотя это не влияет на возможности базы данных, и было бы неплохо, если ваш запрос приводит к множеству строк.

Ответ 5

Нет. Вот почему слои абстракции базы данных, такие как Hibernate, содержат диалекты SQL, в которых вы выбираете тот, который будет использоваться с вашей базой данных.