2010-12-03

Query by Page on JPA

在Query 大量的資料時, 如果沒有將資料作 page的動作, 一次抓回來會在吃掉大量的記憶體去產生相關的 class. 如果, 只需要部份資料慢慢取回處理, 可以採用page 的方式去截去資料.
在 JPA 中, Query 這一個物件有
  • setFirstResult(int startPosition)
  • setMaxResults(int maxResult)
運用這兩個 method 就可以達到 Page Query 的方法了.

在 Pro JPA 2 page. 194 提到, 可用 stateful session 來達到用 存放在 http session 中, 讓 jsp or javaServer faces 可以 作到 PageQuery


@Stateful
public class ResultPagerBean implements ResultPager {
@PersistenceContext(unitName="QueryPaging")
private EntityManager em;

private String reportQueryName;
private long currentPage;
private long maxResults;
private long pageSize;

public long getPageSize() {
return pageSize;
}
public long getMaxPages() {
return maxResults / pageSize;
}

public void init(long pageSize, String countQueryName,
String reportQueryName) {
this.pageSize = pageSize;
this.reportQueryName = reportQueryName;
maxResults = em.createNamedQuery(countQueryName, Long.class)
.getSingleResult();
currentPage = 0;
}

public List getCurrentResults() {
return em.createNamedQuery(reportQueryName)
.setFirstResult(currentPage * pageSize)
.setMaxResults(pageSize)
.getResultList();
}

public void next() {
currentPage ;
}

public void previous() {
currentPage--;
if (currentPage < 0) {
currentPage = 0;
}
}

public long getCurrentPage() {
return currentPage;
}

public void setCurrentPage(long currentPage) {
this.currentPage = currentPage;
}

@Remove
public void finished() {}
}

沒有留言:

張貼留言