Hibernate Criteria Limit机制?

时间:2011-08-31 22:38:35

标签: java sql hibernate criteria

Hibernate Criteria支持提供setMaxResults()方法来限制从db返回的结果。

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

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

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

5 个答案:

答案 0 :(得分:13)

Hibernate要求数据库限制查询返回的结果。它通过方言执行此操作,该方法使用任何特定于数据库的机制来执行此操作(因此对于SQL Server,它将执行类似“从表中选择顶部n *”的操作,Oracle将执行“select * from table in rownum< n“,MySQL将执行”select * from table limit n“等。然后它只返回数据库返回的内容。

答案 1 :(得分:6)

班级org.hibernate.dialect.Dialect包含一个名为supportsLimit()的方法。如果方言子类重写此方法,则它们可以以其数据库flavor的本机方式实现行限制处理。您可以在类org.hibernate.loader.Loader中查看此代码的调用位置,该类具有标题为prepareQueryStatement的方法,只需搜索 limit 一词。

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

limit ?