如何实现??totalSize是计算出来的
解决方案 »
- ibatis update iterate标签问题——急急急,在线等
- 急、、求答案
- 有购物网站的资料吗?
- 请问这个问题怎么回答?
- 生成实体时报Could not create local repository at H:\central-repository 错
- 各位IT高手,jsp+Sqlserver中,图片用流的方式还是读不出来啊,存的进去,读不出来,帮帮忙,最好用一段代码说明啊
- java.sql.SQLException: ORA-01847: day of month must be between 1 and last day of month
- 第一次弄,急救啊,是我的classpath问题还是文件本身的问题啊!!
- 我的JSP还有做什么能够访问数据库?
- 想找对javascript对象的属性和方法阐述的非常详尽的电子书或者相关的资料,谢谢!!
- darwin streaming server配置存储路径出现问题
- jsf页面显示图片问题
////////////////////////// hql paging ///////////////////////////////
public static Paging pagingByHQL(String dbAlias, String hql, Map paramMap, int pageSize, int currentPageNo)
throws DaoException {
try{
ParamUtil.checkEmpty("hql", hql);
}catch (IllegalArgumentException e) {
throw new DaoException(e);
}
hql = SQLHandler.clearSqlNote(hql);
Paging paging = new Paging();
List pageList;
Paging.checkPagSize(pageSize, paging);
try{
if (pageSize < 0) {//no paging
pageList = setQueryParameters(createQuery(dbAlias, hql), paramMap).list();
paging.setTotalSize(pageList.size());
Paging.checkTotalSize(paging);
Paging.refreshInit(paging);
}else{//use paging
QueryTranslatorImpl queryTranslator = compileHql(dbAlias, hql);
SQLQuery sqlQuery = createSQLQuery(dbAlias,SQLHandler.getTotalSizeSql(queryTranslator.getSQLString()), false);
if (null != paramMap && queryTranslator.getParameterTranslations().getNamedParameterNames().size() != 0){
for(String paramName : (Set<String>)queryTranslator.getParameterTranslations().getNamedParameterNames()){
int[] indexs = queryTranslator.getNamedParameterLocs(paramName);
Object paramValue = paramMap.get(paramName);
try{
ParamUtil.checkParam(paramName, paramValue);
}catch (IllegalArgumentException e) {
throw new DaoException(e);
}
for (int index : indexs) {
sqlQuery.setParameter(index, paramValue);
}
}
// for (String paramName : (Set<String>) paramMap.keySet()) {
// //sample parameter ,當然也可以用 SQLHandler 中的方法來分析字串
// int[] indexs = queryTranslator.getNamedParameterLocs(paramName);
// //when use a instance have question,parameter isn't sql class have question
// //use invoke to set parameter.
// Object paramValue = paramMap.get(paramName);
// for (int index : indexs) {
// //set sql parameter
// sqlQuery.setParameter(index, paramValue);
// }
// }
}
paging.setTotalSize(Integer.parseInt((sqlQuery.list().get(0).toString())));
if(paging.getTotalSize() > 0){
paging.setCurrentPageNo(currentPageNo);
Paging.refreshInit(paging);
pageList = setQueryParameters(createQuery(dbAlias, hql), paramMap)
.setFirstResult(paging.getStart()).setMaxResults(paging.getEnd()).list();
}else{
pageList = new ArrayList();
}
}
}catch (HibernateException he) {
throw new DaoException(new StringBuffer("dbAlias:").append(dbAlias)
.append(",paging Query objects occur error!hql:\r\n\r\n").append(hql)
.append("\r\n").append(Paramtor.getParamString((Map)(SQLHandler.getOriginalSQL(hql))[1], paramMap))
.append("\r\nhqlToSql:\r\n\r\n").append(formatSql(compileHql(dbAlias, hql).getSQLString())).toString(), he);
}
paging.setPageList(pageList);
return paging;
}
/////////////////////////////////////////////////////////////
public static String getTotalSizeSql(String parsedSql){
return (new StringBuffer("SELECT COUNT(1) TOTALSIZE FROM(\r\n")).append(parsedSql).append("\r\n)MYTABLE").toString();
}
dao层Query query = super.getHibernateSession().createQuery(hql);
return (Integer) query.uniqueResult();
就可以了
*
* @author asc123014
*
*/
public class Paging {
private int size;
private int pageSize;
private int totalSize;
private int currentPageNo;
private int totalPageCount;
private int start;
private int end;
private List pageList;
private boolean hasNextPage;
private boolean hasPreviousPage; public void setSize(int size) {
this.size = size;
}
public int getSize() {
return size;
} public Paging(){
pageSize = DBConfig.DEFAULT_PAGE_SIZE;
setHasNextPage(false);
setHasPreviousPage(false);
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageSize() {
return pageSize;
}
public void setTotalSize(int totalSize) {
this.totalSize = totalSize;
}
public int getTotalSize() {
return totalSize;
}
public void setCurrentPageNo(int currentPageNo) {
this.currentPageNo = currentPageNo;
}
public int getCurrentPageNo() {
return currentPageNo;
}
public void setTotalPageCount(int totalPageCount) {
this.totalPageCount = totalPageCount;
}
public int getTotalPageCount() {
return totalPageCount;
}
public void setStart(int start) {
this.start = start;
}
public int getStart() {
return start;
}
public void setEnd(int end) {
this.end = end;
}
public int getEnd() {
return end;
}
public void setPageList(List pageList) {
this.pageList = pageList;
}
public List getPageList() {
return pageList;
} public void setHasNextPage(boolean hasNextPage) {
this.hasNextPage = hasNextPage;
}
public boolean getHasNextPage(){
hasNextPage = currentPageNo < totalPageCount;
return hasNextPage;
} public void setHasPreviousPage(boolean hasPreviousPage) {
this.hasPreviousPage = hasPreviousPage;
}
public boolean getHasPreviousPage(){
hasPreviousPage = currentPageNo > 1;
return hasPreviousPage;
}
public static void checkPagSize(int pageSize,Paging paging){
if (pageSize > DBConfig.MAX_PAGE_SIZE) {//可以更改設定文件DEFAULT_PAGE_SIZE=-1這樣就會直接查詢出全部
throw new IllegalArgumentException(new StringBuffer("Can't set paging.pageSize! System limit MAX_PAGE_SIZE is:")
.append(DBConfig.MAX_PAGE_SIZE).append(",but your setter caused pageSize is ")
.append(pageSize).append("!").toString());
}
if(pageSize != 0){//為0時取默契值
paging.pageSize = pageSize;
}
}
/**
* 如去掉不分頁totalSize限定可以取消checkTotalSize
* @param paging
*/
public static void checkTotalSize(Paging paging){
if (paging.totalSize > DBConfig.MAX_PAGE_SIZE) {
throw new IllegalArgumentException(new StringBuffer("Can't set paging.pageList! System limit MAX_PAGE_SIZE is ")
.append(DBConfig.MAX_PAGE_SIZE).append(",but totalSize is ").append(paging.totalSize)
.append("!").toString());
}
}
public static void refreshInit(Paging paging) {
//use rownm > ? and rownm <= ? db ROWNUM start 1(先少于因查看前几页的概率要大于后面的页)
//如paging.getCurrentPageNo()==0则currentPageNo=1,如paging.getCurrentPageNo()<0则currentPageNo=1pageCount
//如paging.getCurrentPageNo() > pageCount则currentPageNo=pageCount,否则取paging.getCurrentPageNo()
int start = 0;
int end = paging.totalSize;
int pageCount = 1;
int currentPageNo = 1;
if (paging.pageSize != -1) {
pageCount = (paging.totalSize - 1) / paging.pageSize + 1;//得到查询sql实数pageCount
currentPageNo = paging.currentPageNo < 1 ? (paging.currentPageNo == -1 ? pageCount : 1) :
(paging.currentPageNo > pageCount ? pageCount : paging.currentPageNo);
start = (currentPageNo - 1) * paging.pageSize;
end = Math.min(currentPageNo * paging.pageSize, paging.totalSize);
}
paging.totalPageCount = pageCount;
paging.currentPageNo = currentPageNo;
paging.start = start;
paging.end = end;
paging.size = end - start;
}
}