是否有一种可移植的方式来“选择第一个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。
如果你想要一种可移植的方式,你需要向上移动一个抽象层,因为没有可移植的SQL方式(不是数据库实际上实现的方式) – 并且使用ORM映射器,例如hibernate。
如果你确实需要原始JDBC,那么你必须为特定于eache的数据库编写特定的SQL – 这通常就是这种情况,因为编写100%portabl SQL在除了微不足道的情况之外都很难。
最后一种方法是在没有任何限制的情况下运行查询,只迭代你得到的10个第一个结果 – 尽管这不会利用数据库function,如果你的查询产生很多行会非常糟糕。
不,这就是为什么像Hibernate这样的数据库抽象层包含SQL 方言 ,您可以选择与数据库一起使用的方言 。