当前位置: 首页 > 面试题库 >

休眠(/ JPA)服务器端分页和MS SQL Server

濮阳祯
2023-03-14
问题内容

我使用 hibernate* / JPA 实现 服务器端数据分页 ,底层数据库是 MS SQL Server 2008。 *

SQL生成如下:

criteria.setFirstResult(pagingParams.getDisplayStart())
.setMaxResults(pagingParams.getDisplayLength());

(主要工作在于创建适当的过滤器/排序,但这与此处无关)

我正在观察的是以下SQL:

page (0-20):
select top 20 this_.id as id11_9_,...

page (20-40):
select top 40 this_.id as id11_9_,...

page (40-60):
select top 60 this_.id as id11_9_,...

… 等等。

显然,如果基础结果集太大,这(a)会遇到严重问题,而(b)与分页根本没有太大关系:-(

有人遇到过同样的问题吗?

更新
:似乎NHibernate(Hibernate的.NET实现)利用Row_Number()了T-SQL 的功能。可惜的是Hibernate没有…


问题答案:

回复迟了一点,但可能会有所帮助,所以我将其发布。遇到了完全相同的问题,并且很难找到答案。解决方案是使用org.hibernate.dialect.SQLServer2012DialectHibernate
4.3.0中包含的方法。生成的查询变为(粘贴没有列名和别名的真实Hibernate转储):

WITH query 
     AS (SELECT inner_query.*, 
                Row_number() 
                  OVER ( 
                    ORDER BY CURRENT_TIMESTAMP) AS __hibernate_row_nr__ 
         FROM   (SELECT TOP(?) <COLUMN_NAMES> AS <ALIASES>
FROM <TABLE_NAME>
) inner_query) 
SELECT <ALIASES>
FROM   query 
WHERE  __hibernate_row_nr__ >= ? 
       AND __hibernate_row_nr__ < ?

注意内部查询和Row_number()函数的用法。他们终于解决了!



 类似资料:
  • 问题内容: 如果我能以某种方式将这两个框架结合在一起,那就太酷了。 单击Primefaces数据表上的下一个或上一个按钮将触发查询,从而使用JPA限制查询结果。 同样,也许通过某种机制,primefaces组件也可以从另一个JPA选择计数查询中获取总页数。 有没有关于如何将它们投入工作的示例? 请分享您的经验。 谢谢 ! 问题答案: 您可以使用LazyDataModel。在此示例中,我将使用Net

  • 问题内容: 我正在设计一个基于JPA / Hibernate,Spring和Wicket的新应用。我对DAO和Service层之间的区别还不清楚。根据维基百科,DAO是 一个为某种类型的数据库或持久性机制提供抽象接口的对象,提供某些特定的操作而不公开数据库的详细信息。 我想知道DAO是否可以包含与数据访问无关的方法,但是使用查询执行起来会更容易吗?例如,“获取在一组特定机场上运营的所有航空公司的列

  • 问题内容: 显示标签提供给定对象的分页功能。Hibernates提供了仅提取每页所需记录的选项。在我的项目中,我们同时使用了这两个概念。 显示广告代码:我需要根据过滤条件提取所有记录并将其存储在会话中。然后这个displaytag将负责所有分页和排序。因此Httpsession拥有很多数据。 hibernate:它仅从数据库中获取请求的对象数,无需为每个请求打开会话。 最好的做事方法是什么?或者如

  • 问题内容: 我将GWT用于UI,将Hibernate / Spring用于业务层。以下GWT小部件用于显示记录。(http://collectionofdemos.appspot.com/demo/com.google.gwt.gen2.demo.scrolltable.PagingScrollTableDemo /PagingScrollTableDemo.html )。我认为排序是在客户端完成

  • 问题内容: 我在Heroku服务器上托管了一个网站( 我是Heroku btw的新用户 ),并且由于它是免费软件包,因此在 闲置30m 后便 进入 休眠 状态 ,并在用户点击它后再次将其投入使用,大约需要7秒才能成功。 我正在考虑运行nodejs作业或每隔29m就会打开网站的一次作业,以使服务器永不休眠,最初,我得到的是这样的内容: 注意:那只是在浏览器中打开它,而不是关闭它。 首先,这样做是否合

  • 问题内容: 有人可以透视一下JPA和Hibernate之间的区别吗?还是将这些互补的概念一起使用? 问题答案: 大致来说,JPA是java社区的一个标准,这里是specs,它是由Hibernate家伙实现(并扩展)的(此处提供一些信息)。作为规范,您将不会直接使用JPA,而是使用JPA实现。 请注意,如果要使用hibernateJPA扩展,将破坏与其他JPA实现的兼容性(尽管有些人会说“为什么要使