在显示标签中,我使用了分页功能,当我想查看 15 行的列表但显示标签从数据库中获取所有行时。每次我点击分页号时,它都会从 db 中获取所有行。因此,它会降低应用程序的性能。
当我想查看 15 行时,我希望在显示标签中显示标签也从 db 中获取 15 行而不是整个 db 行。如果有人知道,请帮助我。
在显示标签中,我使用了分页功能,当我想查看 15 行的列表但显示标签从数据库中获取所有行时。每次我点击分页号时,它都会从 db 中获取所有行。因此,它会降低应用程序的性能。
当我想查看 15 行时,我希望在显示标签中显示标签也从 db 中获取 15 行而不是整个 db 行。如果有人知道,请帮助我。
您必须使用外部分页功能。首先,在 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;
}
Displaytag 使用以“d-”开头的参数发送它的分页和排序数据。如此快速的解决方案可以是检查请求是否包含以“d-”开头的内容,如果是,则不要再次执行您的查询。
由于某种原因,使用PaginatedList
似乎不起作用。我尝试使用最新版本,似乎有一些错误,attribute size must be specified
即使我对大小值进行硬编码,它也会给出错误。我浏览了其他链接/博客,很多人都指出了这一点。
我最终使用的选项是将数据存储在会话中。当用户单击下一步时,它会检查会话中的数据。如果存在,它不会命中服务层。到目前为止,它运行良好。