【问题标题】:Is there a portable way to have "SELECT FIRST 10 * FROM T" semantic?是否有一种可移植的方式来获得“SELECT FIRST 10 * FROM T”语义?
【发布时间】:2011-03-24 22:56:52
【问题描述】:

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

我在 wikipedia 上找到了Result limits,显然这不能用 sql 以可移植的方式完成。

另一种方法可能是JdbcTemplate,它提供了许多查询方法,但是我如何才能确定已读取了足够多的行。通过 RowMapper 和 ResultSetExtractor 之类的回调无法表明已读取了足够的数据。

编辑:我正在寻找 JdbcTemplate 的解决方案 这个post 建议使用我忽略的setMaxRows

【问题讨论】:

    标签: java sql spring jdbc


    【解决方案1】:

    获取HibernateJPA。两人都熟悉各种数据库方言,并且会在后台透明地处理令人讨厌的数据库细节。

    在 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();
    

    【讨论】:

    • 实际上,您可以使用 Hibernate 中的 Dialect 类来修改 SQL 以包含限制,而不必执行整个映射操作。 Dialect 定义了一个 getLimitString() 方法,您可以使用它来提取为各种 DB 建立限制的机制
    • 这是ORM的一大亮点。在 MySql 中,你也可以使用 LIMIT 命令来做到这一点。
    【解决方案2】:

    没有。这就是为什么像 Hibernate 这样的数据库抽象层包含 SQL 方言,您可以在其中选择用于数据库的方言。

    【讨论】:

      【解决方案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——这通常是因为编写 100% 可移植的 SQL 在所有情况下都非常困难,除了琐碎的情况。

        最后的手段是在没有任何限制的情况下运行查询,并且只迭代您返回的 10 个第一个结果 - 尽管这没有利用数据库功能并且如果您的查询结果是 many 行。

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

          • 我能理解为什么每个人都打破了这个标准。 LIMIT 足够了,为什么还要四个关键字?
          • @dan04:现在这只是纯粹的疯狂谈话 =)
          • 嗯。另一种标准的方式将很少被实施,以至于不符合标准。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-04-01
          • 2015-03-09
          • 1970-01-01
          • 2015-09-19
          • 2022-01-03
          • 2012-11-23
          • 2015-03-12
          相关资源
          最近更新 更多