Hibernate Criteria Limit机制?

joh*_*ohn 18 java sql hibernate criteria

Hibernate Criteria支持提供了setMaxResults()一种限制db返回结果的方法.

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

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

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

Rit*_*esh 13

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


jon*_*one 6

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

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


tim*_*hew 1

HQL 不支持像 SQL 中那样的查询内部限制,仅支持setMaxResults()您也发现的限制。

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