7

在显示标签中,我使用了分页功能,当我想查看 15 行的列表但显示标签从数据库中获取所有行时。每次我点击分页号时,它都会从 db 中获取所有行。因此,它会降低应用程序的性能。

当我想查看 15 行时,我希望在显示标签中显示标签也从 db 中获取 15 行而不是整个 db 行。如果有人知道,请帮助我。

4

3 回答 3

12

您必须使用外部分页功能。首先,在 html 标记中指定您正在使用外部分页。并创建一个对象实现org.displaytag.pagination.PaginatedList。最后,您必须实现只对 15 行进行实际查询并返回 PaginatedList 的 DAO。

1)你的jsp看起来像这样

<display:table name="command" sort="external" partialList="true" size="${command.fullListSize}" pagesize="${command.objectsPerPage}">
  <display:column property="name" title="name"/>
  ...
</display:table>

请注意,它指定排序是外部的。

2) org.displaytag.pagination.PaginatedList 实现。

public class PaginatedListImpl<T> implements PaginatedList{
  private int fullListSize;
  private int objectsPerPage;
  private int pageNumber;
  private String searchId;
  private String sortCriterion;
  private SortOrderEnum sortDirection;
  private List<T> list;

//getters and setters
...
}

3)使用休眠的DAO实现示例。您可以使用 JDBC 或其他任何方法来执行此操作,但请确保您进行了正确的查询,以正确的顺序获取 15 行并返回 PaginatedListImpl 对象。

@SuppressWarnings("unchecked")
public PaginatedListImpl<T> getPaginatedList(PaginatedListImpl paginatedList) {
  int pageNum = paginatedList.getPageNumber();

  final int objectsPerPage = paginatedList.getObjectsPerPage();
  final int firstResult = objectsPerPage * pageNum;
  String sortOrderCriterion = pagiantedList.getSortOrderCriterion();
  String sortOrder = paginatedList.getSortOrder

  String className = type.getName().substring(type.getName().lastIndexOf(".") + 1);
  final StringBuilder fromClause = new StringBuilder("from " + className + " " + alias);
  String orderByClause = new StringBuilder(" order by ").append(sortCriterion).append(" ").append(sortDirection);

  final String hql = new StringBuilder().append(fromClause).append(orderClause).toString();
  List<T> resultList = getHibernateTemplate().executeFind(new HibernateCallback() {
  public Object doInHibernate(Session session) throws HibernateException, SQLException {
    return session.createQuery(hql)
      .setFirstResult(firstResult)
      .setMaxResults(objectsPerPage)
      .list();
    }
  });
  Long count = (Long)getHibernateTemplate().execute(new HibernateCallback() {           
    public Object doInHibernate(Session session) throws HibernateException, SQLException {
      return session.createQuery("select count(*) " +  fromClause).uniqueResult();
    }
  });
  paginatedList.setFullListSize(count.intValue());
  paginatedList.setList(resultList);
  paginatedList.setPageNumber(pageNum+1);
  paginatedList.setObjectsPerPage(objectsPerPage);
  return paginatedList;
}
于 2010-10-10T10:03:16.627 回答
3

Displaytag 使用以“d-”开头的参数发送它的分页和排序数据。如此快速的解决方案可以是检查请求是否包含以“d-”开头的内容,如果是,则不要再次执行您的查询。

于 2011-03-31T14:07:53.830 回答
0

由于某种原因,使用PaginatedList似乎不起作用。我尝试使用最新版本,似乎有一些错误,attribute size must be specified即使我对大小值进行硬编码,它也会给出错误。我浏览了其他链接/博客,很多人都指出了这一点。

我最终使用的选项是将数据存储在会话中。当用户单击下一步时,它会检查会话中的数据。如果存在,它不会命中服务层。到目前为止,它运行良好。

于 2012-09-18T20:24:02.837 回答