2012-04-13 82 views
7

我很抱歉问这个问题,如果有人已经问过它,并提出一个可能愚蠢的问题,但我是新来的,你是专家,我很乐意向你学习专家的意见和经验。Jpa分页与数字和下一个,以前

我想将分页添加到应用程序,每页显示200条记录。页面的底部应该有数字。如果有1050,第一页将显示100,页面底部将显示数字1,2,3,4,5 & 6.

完成此操作的一般逻辑是什么? 我知道数据库必须每次选择200,我必须跟踪第一条记录。

  1. 有没有办法知道总共返回多少条记录,以便我可以知道在页面底部显示多少个数字?它是否需要选择count()语句或其他?
  2. 对于1050条记​​录,将显示数字1,2,3,4,5 & 6并单击每条记录需要调用服务器。有没有办法知道下次调用服务器时会返回多少条记录?它是否需要选择count()语句或其他?
+0

谢谢大家花时间回答我的问题。我会更新我的代码,并会通知您是否对此有进一步的问题。 – javafun 2012-04-14 00:19:44

回答

6

您可以使用JPA Criteria API来完成此操作。假设TypedQuery,您将使用setFirstResultsetLastResult来限制从数据库返回的记录。当然,这些方法的值将取决于请求的页面以及每页显示的记录数。

first = (page - 1) * page size; 
last = (page * size) - 1; 

注意:这假设第一页是1(而不是零)。

要获得记录计数,请执行标准条件查询。举例:

final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); 
final CriteriaQuery<Long> countQuery = builder.createQuery(Long.class); 
countQuery.select(builder.count(countQuery.from(MyEntity.class))); 
final Long count = entityManager.createQuery(countQuery) 
     .getSingleResult(); 

您可以自定义上述代码以执行相对于另一个查询的计数。最后,你需要一些方法将总数传回客户端。这样做的一种方法是将查询的结果集包装到另一个包含计数属性的对象中,或者由于DAO调用返回所述对象。或者,您可以将count属性存储在请求范围内的对象中。

public class ResultListWrapper<T> { 
    private Long count; 
    private Collection<T> results; 

    // constructor, getters, setters 
} 
+0

谢谢你! – javafun 2012-04-24 17:03:04

0

是的,你必须在获取行自己之前做一个select count。

2

您通常会执行相同的查询,除了在运行实际查询以查找有多少页之前使用count int选择列表而不是列之前。入门休眠特定的页面就可以用类似做到:

int maxRecords = // page size ... 
int startRow = // page number * page size 
Query query = session.createQuery('...'); 
query.setMaxResults(maxRecords); 
query.setFirstResult(startRow); 

如果执行额外的查询操作,那么你可以考虑只提供下一首/上链接或根据需要或者提供额外的页面过于昂贵(如当最后一个加载数据进入视图时)通过ajax。

用于显示分页结果,包括使用display tag JSP标签库来建议(假设您使用jsp页面显示此数据),包括显示页码链接。假设您可以将它显示到JSP,则显示标记将处理表格数据的分页和排序显示。

+0

感谢您的帮助! – javafun 2012-04-24 17:02:55

0

看看Spring Data JPA。这基本上是Perception如何提出的建议,只是你不必这样做,框架就是为你做的。默认情况下会进行分页和排序(如果您不想使用Query DSL,您仍然需要进行自我筛选)。

他们在主页上有一个1小时的视频,显示了一个快速介绍,但您只需要观看大约15分钟即可了解id的功能。