【问题标题】:Hibernate Criteria Limit mechanism?Hibernate Criteria Limit 机制?
【发布时间】:2011-11-08 00:31:06
【问题描述】:

Hibernate Criteria 支持提供了一个setMaxResults() 方法来限制从数据库返回的结果。

我在他们的文档中找不到任何答案 - 这是如何实现的?它是查询整个结果集然后只返回请求号吗?还是真的限制了数据库端的查询(想想mySql中的LIMIT关键字)。

这很重要,因为如果一个查询可能返回许多结果,我真的需要知道 setMaxResults() 是否仍会查询数据库中的所有行(这会很糟糕)。

另外——如果它真的限制了数据库端的行数,它是如何实现这个跨数据库的(因为我不认为每个 rdbms 都支持像 mySql 那样的 LIMIT 功能)。

【问题讨论】:

    标签: java sql hibernate criteria


    【解决方案1】:

    Hibernate 要求数据库限制查询返回的结果。它通过方言执行此操作,该方言使用任何特定于数据库的机制来执行此操作(因此对于 SQL Server,它将执行诸如“从表中选择前 n 个*”之类的操作,Oracle 将执行“从行数

    【讨论】:

    • 有趣。那么,如果他们能够在给定标准 setMaxResults 的情况下转换为特定方言,那么为什么他们没有提供限制使用 HQL 的方法?
    • 这可能会提供一些明确性:stackoverflow.com/questions/1239723/…。我的理解是,它归结为保持 HQL 部分数据库不可知,然后通过 setMaxResults 等其他方法调用来完成方言特定功能
    • 对不起@Ritesh,我看到我们发布了相同的链接,你显然比我打字快:)
    【解决方案2】:

    org.hibernate.dialect.Dialect 类包含一个名为supportsLimit() 的方法。如果方言子类覆盖此方法,它们可以以一种原生于其数据库风格的方式实现行限制处理。您可以在类org.hibernate.loader.Loader 中查看此代码的调用位置,该类有一个名为prepareQueryStatement 的方法,只需搜索单词limit

    但是,如果方言不支持此功能,则会对 ResultSet 迭代器进行严格检查,以确保在达到限制时停止构造 Java 对象(实体)结果。此代码也位于Loader

    【讨论】:

      【解决方案3】:

      我同时使用 Hibernate 和 Hibernate Search,而无需查看底层实现,我可以告诉您它们绝对不会返回所有结果。我已经实现了返回所有结果的相同查询,然后将其更改为设置第一个结果和最大结果(以实现分页),并且性能提升很大。

      他们可能会为此使用特定于方言的 SQL,例如MySQL 中的 LIMIT,Oracle 中的 ROWNUM。您的实体经理知道您使用的方言,所以这很简单。

      最后,如果您真的想检查 SQL Hibernate 为该查询生成了什么,只需在创建实体管理器/工厂时将“show_sql”属性设置为 true,它会将运行的所有 SQL 吐出到控制台。

      【讨论】:

        【解决方案4】:

        HQL 不支持像 SQL 那样的查询中的限制,只支持您也找到的 setMaxResults()

        要确定它是否将 setMaxResults() 转换为 LIMIT 查询,您可以打开 SQL 日志记录。

        【讨论】:

          【解决方案5】:

          我知道问题有点老了。但是是的,setMaxResults() 确实限制了数据库端的行数。

          如果您真的查看您的 Hibernate SQL 输出,您会发现以下 SQL 语句已附加到您的查询中。

          limit ?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-02-03
            • 2011-10-28
            • 2011-02-18
            • 2017-03-15
            • 1970-01-01
            • 2013-08-19
            • 1970-01-01
            相关资源
            最近更新 更多