Существует ли портативный способ иметь “ВЫБОР СНАЧАЛА 10 * ОТ T”, семантического?

Я хочу считать данные в блоках, говорят что записи 10k от базы данных.

Я нашел пределы Результата на Википедию, и кажется очевидным, что это не может сделанный с sql портативным способом.

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

Править: Я искал решение для JdbcTemplate, Это сообщение предлагает использовать setMaxRows, который я пропустил.

13
задан stacker 4 August 2010 в 06:36
поделиться

5 ответов

Возьмите 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();
15
ответ дан 1 December 2019 в 21:10
поделиться

Не существует переносимого способа сделать это на простом SQL, потому что разные механизмы SQL используют для этого разные синтаксисы.

Используйте уровень абстракции базы данных или DBAL.

http://en.wikipedia.org/wiki/Database_abstraction_layer

http://jonasbandi.net/wiki/index.php/ORM_Solutions_for_Java

4
ответ дан 1 December 2019 в 21:10
поделиться

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

1
ответ дан 1 December 2019 в 21:10
поделиться

Существует стандартный синтаксис ANSI из SQL: 2008 :

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

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

5
ответ дан 1 December 2019 в 21:10
поделиться

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

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

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

2
ответ дан 1 December 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: