query.setFirstResult(0)和query.setFirstResult(5)生成的sql不一样。

licwsh 2014-12-17 03:26:41
query.setFirstResult(0);
query.setMaxResults(5);

query.setFirstResult(1);
query.setMaxResults(5);
hibernate 自动生成sql后不一样
query.setFirstResult(0);
如下:
select
*
from
( select
article0_.id as id241_
from
v_article article0_
where
article0_.articleClass_id in (
select
articlecla1_.id
from
v_articleclass articlecla1_
where
articlecla1_.sysClass=0
and articlecla1_.deleteStatus=0
and articlecla1_.sequence<10
)
order by
article0_.ishot desc,
article0_.id )
where
rownum <= ?

query.setFirstResult(1);如下:
select
*
from
( select
row_.*,
rownum rownum_
from
( select
article0_.id as id241_
from
v_article article0_
where
article0_.articleClass_id in (
select
articlecla1_.id
from
v_articleclass articlecla1_
where
articlecla1_.sysClass=0
and articlecla1_.deleteStatus=0
and articlecla1_.sequence<10
)
order by
article0_.ishot desc,
article0_.id ) row_ )
where
rownum_ <= ?
and rownum_ > ?
这样的话在进行分页的时候,第一页和第二页有可能出现重复的情况(感觉是在order by的结果存在不唯一的时候:像上面的ishot的值一样的时候,有可能存在重复的情况,原因就是第一次的setFirstResult(0)生成的sql和后面不等于0生成的sql不一样。)
请问有大神遇到这样的问题吗?解决方法可以是再加一个order by id,就可以解决了,但是有没有办法使setFirstResult等于0的时候和不等于0的时候 生成的sql 一样。

求教。。。。
...全文
141 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
licwsh 2014-12-17
  • 打赏
  • 举报
回复 1
自己先顶一下!!!
Hibernate中的query 博客分类: • Hibernate HibernateSQLSQL ServerMySQLJDBC Hibernate中的query.setFirstResult(),query.setMaxResults(); 一、query.scroll()和query.setFirstResult(),query.setMaxResults();这两种方法都可以取到一定范围内的数据,用来数据分页显示。那么两者区别,以及两者的效率如何? 答:1.scroll是用JDBC2.0的可滚动结果集实现;query.setMaxResults();query.setFirstResult()是数据库SQL语句实现。 2.你说是在数据库就分页好呢?还是把结果集都取到内存再分页好呢?(应该是在数据库就分了好些吧,但是如果在内存分页的话,换页的时候是不是更快一些呢?) 3.在数据库进行分页是首选的方式。数据库分页实际上是利用数据库本身SQL扩展的功能进行分页,例如MySQL的 limit 0,50这样的SQL语句。不但速度快,而且非常节省内存。不过不是每种数据库的都有这种分页支持的SQL,例如SQL Server就不支持。 4.scroll是利用JDBC2.0的功能做分页的,那么就完全取决于特定数据库的JDBC Driver的实现了。事实上大部分JDBC Driver都是把所有的结果集都一次取到内存,然后再分页的。如果这个结果集非常大,例如几万条,不但程序执行速度会很慢,而且很容易导致out of memory。当然个别JDBC Driver使用了服务器端游标来实现,那么就不会导致这种问题,例如jTDS。 二、Hibernate可以使用Query.setMaxResults方法简单地设置需要查询的最大结果集。 然后Hibernate会自动根据所设置的数据库方言翻译成相应的SQL语句提交给数据库。比如如果数据库是Oracle,SQL Server等,则翻译为类似select ... top 10之类的SQL语句,若是MySQL,则翻译为select ... limit 10之类的SQL。 三、举例: Java代码 1. import org.hibernate.Query; 2. 3. query.setFirstResult(0),query.setMaxResults(4);相当于MySQL中的limit 0, 4; 4. public void testQuery() { 5. Session session = null; 6. try { 7. session = HibernateUtils.getSession(); 8. session.beginTransaction(); 9. Query query = session.createQuery("from User"); 10. query.setFirstResult(0);//从第一条记录开始 11. query.setMaxResults(4);//取出四条记录 12. List userList = query.list(); 13. for (Iterator iter=userList.iterator(); iter.hasNext();) { 14. User user = (User)iter.next(); 15. System.out.println(user.getId()); 16. System.out.println(user.getName()); 17. } 18. session.getTransaction().commit(); 19. }catch(Exception e) { 20. e.printStackTrace(); 21. session.getTransaction().rollback(); 22. }finally { 23. HibernateUtils.closeSession(session); 24. } 25. }

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧