- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
docs说:
Criteria setMaxResults(int maxResults)
>Set a limit upon the number of objects to be retrieved.
假设我有以下 Criteria
:
Criteria criteria = createCriteria(); // creates criteria for MY_TABLE entity
criteria.list().length; // let's say there's a million records in this table
将添加criteria.setMaxResults(1)
只返回一行?或者,它是否仍会返回 100 万行,但选择其中之一?
当针对我的 Oracle 数据库运行类似于我上面的代码示例的查询时,我看到了 ... ROWNUM < 2
正在生成 SQL。
但是,当我看到 ROWNUM FAQ , 我没看懂 ROWNUM
将在检索记录之前 或之后应用。我希望“之前”是有效的,而“之后”不会用于大型结果集。
ROWNUM is evaluated AFTER records are selected from the database and BEFORE the execution of ORDER BY clause.
最佳答案
Will adding criteria.setMaxResults(1) return only a single row? Or, will it still return 1 million rows, but pick one of them?
是的,它只会返回一行,hibernate 使用 db 特定的特性来限制结果。Hibernate 不会选择 100 万行,但 db 会选择第一行(此语句是关于 hibernate 生成的查询,而不是 ROWNUM
)。
假设您有一个名为 user
的表,其中有 8 行。
+----+-----------+-------+
| id | name | score |
+----+-----------+-------+
| 1 | Xyz | 500 |
| 2 | Name3 | 200 |
| 3 | Name2 | 300 |
| 4 | Name4 | 100 |
| 5 | SomeName | 600 |
| 6 | BSomeName | 150 |
| 7 | Asomename | 80 |
| 8 | Csomename | 700 |
+----+-----------+-------+
现在,您运行以下条件。
criteria.add(Restriction.le("score", 500));
criteria.addOrder(Order.asc("name"));
criteria.setMaxResults(2);
Hibernate 生成的以下查询。
select * from(select * from user where score <= 500 order by name) where ROWNUM < 3;
DB 将按以下顺序执行。
ROWNUM
分配给每一行。ROWNUM
小于 3 的行并返回它们。结果会是。
+----+-----------+-------+
| id | name | score |
+----+-----------+-------+
| 7 | ASomeName | 80 |
| 6 | Bsomename | 150 |
+----+-----------+-------+
DB不管有多少记录都会执行上面的步骤,所以当你有order by并且满足条件的行很多的时候,Query会很慢。
I didn't understand if ROWNUM will be applied before retrieving records, or after. I would expect "before" to be efficient, whereas "after" would not be for a large result set.
ROWNUMS
是给满足所有给定条件的行的索引。 DB 将继续检查每一行是否应用 WHERE 子句中提供的所有条件,如果一切正常,则为该行分配一个数字,继续进行下一行。正如文档所说,在从数据库中选择记录后评估 ROWNUM
意味着满足所有条件。
BEFORE the execution of ORDER BY clause.
ROWNUM
与其他数据库(MySQL、Postgrage 等)中的 LIMIT 不同。即 LIMIT 查找所有行,对它们进行排序,然后返回有限的结果。而 ROWNUM 将在满足所有条件后立即分配给行。这就是 hibernate 生成内部查询以获得一致排序结果的原因。
如果执行以下查询,如果使用上表中给出的相同数据。
select * from user where score <= 500 where row_num < 3 order by name;
您将得到以下结果。
+----+-----------+-------+
| id | name | score |
+----+-----------+-------+
| 3 | Name2 | 300 |
| 2 | Name3 | 200 |
+----+-----------+-------+
这是因为 DB 开始查找满足条件(score <= 500)的行,为每个行赋予 ROWNUM 索引,直到 ROWNUM < 3,然后按名称对行进行排序。一旦基于查询的其余部分将行标识为结果集的一部分,Oracle 将立即应用 rownum 谓词
关于java - 了解 Hibernate 的条件#setMaxResults,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25252662/
我有一个带有 @ManyToMany(fetch=FetchType.EAGER) 子集合的父实体。 我只需要加载我找到的父实体的第一条记录,因此我使用以下条件加载它: session.createC
我正在使用 Hibernate 并且我想执行这个查询: SELECT s.executionTime, g.date, s.name FROM SimulationStatsGroup g LEFT
如果我不设置setFirstResult(-),每次递归调用criteria.setmaxresults(10),它会自动从数据库中抓取接下来的10条吗? 最佳答案 没有。您必须使用 criteria
每当我使用 setMaxResult 时,我都会在 hibernate session (而不是实体管理器)中使用条件,我会收到如下异常: 代码段: crit2.add(criterion).setF
我在 Criteria Builder 中编写了一个查询,它看起来像这样。 private EntityManager entitymanager; CriteriaBuilder criteriaB
App使用JPA Hibernate,数据库为Sybase;它针对每种域类型都有多个搜索屏幕。我知道 query.setMaxResult(limit) 将防止查询返回太多。对于 Sybase,我相信
我正在尝试从给定特定用户和最大数量的数据库中获取一定数量的行。这是当前代码的样子: @Override public Collection findMaxByUser(User _user, int
我正在使用 nHibernate 并尝试实现一些分页。如果我运行这段代码 IList list = session.CreateQuery("FROM Author").List(); 它返回 8 条
我们可以使用 setMaxresults 属性来获取页面中的响应,而不是为 bigquery 中的作业设置AllowLargeResults true,或者即使我们已经设置了 setMaxresult
我收到此错误:“LDAPSearchException:超出大小限制”错误并且服务器仅返回 500 个结果。我们经验丰富的 LDAP 管理员向我保证,服务器上没有设置此限制。事实上,通过在 CLI 上
我是 hibernate 新手。我有一个如下查询 select a.*, b.* from tableA a join tableB b on b.aId = a.id left join table
我是 Hibernate 的新手,使用 SetMaxResults() 函数时遇到一些错误。这是我的 MySQL 表数据:: 1 J. C. Smell 2 J. C. Smell 3 J
我的应用程序中有分页问题。我想使用 setFirstResult 和 setMaxResults 方法,但它给了我错误的输出: (我的数据库:SQLite) 例子: Session sessi
我与 hibernate 有一些争执。我的查询虽然经过优化,但相当繁重。我的优化之一在于限制返回的结果集。因此,在 hibernate 中,我使用了 setMaxResultSet 方法,但我遇到了本
docs说: Criteria setMaxResults(int maxResults) >Set a limit upon the number of objects to be retrieve
当我在查询上调用 setMaxResults 时,它似乎想将最大数字视为“2”,无论它的实际值是多少。 function findMostRecentByOwnerUser(\Entities\Use
什么会导致 CriteriaQuery orderBy 方法停止工作? 实现如下: OpenJPAEntityManager kem = OpenJPAPersistence.cast(ent
在一个特定的项目中,我遇到了不同配置中类型化查询的问题。 当在 TypedQuery 上设置 maxResults 值大于查询返回的实际结果数时,getResultList() 的执行时间会非常长(有
我编写了以下代码片段,使用 hibernate 作为 JPA 提供程序从 zips 表中获取某些 zip 文件的记录。 public List getZipEntityFromZipName(
以下两种执行结果有限的简单 Hibernate 查询的方法在 Sybase 中都不起作用。它们都会导致 SybSQLException:'@p0' 附近的语法不正确。 Query q = sessio
我是一名优秀的程序员,十分优秀!