是否有一种可移植的方式来“选择第一个10 *从T”语义?

我想从数据库中读取10k记录块中的数据。

我在维基百科上发现了结果限制 ,很明显这不能用sql以便携方式完成。

另一种方法可能是JdbcTemplate ,它提供了许多查询方法,但我怎么能确定已经读取了足够的行。 通过RowMapper和ResultSetExtractor等回调,无法指示已读取足够的数据。

编辑:我正在寻找JdbcTemplate的解决方案这篇文章建议使用我忽略的setMaxRows 。

获取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(); 

SQL:2008中有一个ANSI标准语法:

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

…但目前大多数数据库都不支持它。

在纯SQL上没有可移植的方法,因为不同的SQL引擎使用不同的语法。

使用数据库抽象层或DBAL。

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

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

如果你想要一种可移植的方式,你需要向上移动一个抽象层,因为没有可移植的SQL方式(不是数据库实际上实现的方式) – 并且使用ORM映射器,例如hibernate。

如果你确实需要原始JDBC,那么你必须为特定于eache的数据库编写特定的SQL – 这通常就是这种情况,因为编写100%portabl SQL在除了微不足道的情况之外都很难。

最后一种方法是在没有任何限制的情况下运行查询,只迭代你得到的10个第一个结果 – 尽管这不会利用数据库function,如果你的查询产生很多行会非常糟糕。

不,这就是为什么像Hibernate这样的数据库抽象层包含SQL 方言 ,您可以选择与数据库一起使用的方言