docs说:
Criteria setMaxResults(int maxResults)
>Set a limit upon the number of objects to be retrieved.

假设我有以下标准:

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 DB运行类似于上面的代码示例的查询时,我看到了…… 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将按以下顺序执行它.

>找到得分小于或等于500的所有行.这里将找到6行.
>按名称按升序排序所有行.
>为每行分配ROWNUM.
>找到ROWNUM小于3的所有行并返回它们.

结果将是.

+----+-----------+-------+
| id |   name    | score |
+----+-----------+-------+
|  7 | ASomeName |   80  |
|  6 | Bsomename |   150 |
+----+-----------+-------+

无论有多少记录,DB都会执行上述步骤,所以当你有顺序并且有很多行满足条件时,查询会非常慢.

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子句中提供的所有条件,如果everythig没有问题,则为该行分配一个数字,然后转到下一行.正如文档所说,评估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开始寻找满足条件的行(得分<= 500),给它们每个ROWNUM索引,直到ROWNUM< 3,然后按名称排序行.
一旦根据查询的其余部分将行标识为结果集的一部分,Oracle将应用rownum谓词

阅读他们非常详细的this和this文章.

java – 了解Hibernate的标准#setMaxResults的更多相关文章

  1. android – 让应用程序在后台运行

    我想让我的应用程序在后台运行我有一个应用程序将用户的位置发送到我们的服务器我有以下代码:我希望我的应用程序在后台运行.我希望它在手机开机时自动启动解决方法对于您的问题,一个非常简单的答案是使用Service.它将允许您在后台执行各种任务,并且是您静默地将您的位置发送到服务器的最佳选择.阅读this答案寻求帮助.

  2. android – 如何让应用程序在后台运行?继续收集数据?

    在底部更新我编写了一个记录用户位置,当前速度,平均速度和最高速度的应用程序.我想知道如何使应用程序执行以下操作:>防止屏幕在屏幕上打开时关闭>如果用户打开另一个应用程序或返回主屏幕,接到电话等,应用程序应继续收集数据(或者每次更新位置时将所有数据写入数据库会更好吗?并且可能有一个按钮来表示何时开始和停止收集数据?

  3. android – 在网络和GPS提供商之间切换

    我想实现一个locationListener,它将根据可用性在网络和GPS提供商之间切换.例如,如果GPS未启用,我希望它使用网络,但一旦GPS打开,我希望它停止监听来自网络的位置更新,并开始从GPS听.同样地,一旦GPS被关闭,我希望它从网络开始监听更新.那可能吗?SubquestionGPS是否与网络一样快提供位置修复?

  4. Hibernate 主清单文件配制的详细介绍

    这篇文章主要介绍了Hibernate 主清单文件配制的详细介绍的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下

  5. Hibernate 查询方式总结

    get() and load() HQL 等查询方式

  6. jsp hibernate的分页代码第1/3页

    在查询分页代码中使用Hibernate的一大好处是,既兼顾了查询分页的性能,同时又保证了代码在不同的数据库之间的可移植性。

  7. JSP 开发之hibernate配置二级缓存的方法

    这篇文章主要介绍了JSP 开发之hibernate配置二级缓存的方法的相关资料,这里提供两种配置二级缓存的方法,需要的朋友可以参考下

  8. jsp hibernate 数据保存操作的原理

    当执行到session.save()方法时,Hibernate并不会马上生成insert SQL语句来进行数据的保存,而是当稍后清理session的缓存时才有可能执行insert SQL语句,那么session.save()方法到底会执行哪些步骤呢?

  9. JSP开发之hibernate之单向多对一关联的实例

    这篇文章主要介绍了JSP开发之hibernate之单向多对一关联的实例的相关资料,希望通过本文能帮助到大家,让大家实现这样的功能,需要的朋友可以参考下

  10. 详解hibernate自动创建表的配置

    这篇文章主要介绍了详解hibernate自动创建表的配置的相关资料,需要的朋友可以参考下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部