hibernate分页分页

chissie 2010-07-09 03:17:58
底层的通用类全齐,问题是接下来的工具类和web层该怎么写呢?

/**
* fileName: Page.java
* description: 分页使用Bean
*/
package com.sofmit.sd.framework.util;

import java.util.List;

/**
* 分页使用Bean
*
* @author zenggh
* @date June 1, 2010
*/
public class Page {

/**
* 默认的每页显示数据条数
*/
private static int DEFAULT_PAGE_SIZE = 10;

/**
* 每页显示数据
*/
private int pageSize = DEFAULT_PAGE_SIZE;

/**
* 总的数据数
*/
private int totalCount; // �ܼ�¼��

/**
* 当前页数
*/
private int currentPage;

/**
* 总页数
*/
private int pageCount;
/**
* 是否存在上一页
*/
private Boolean previous;

/**
* 是否存在下一页
*/
private Boolean next;

/**
* 分页显示的数据集合
*/
private List date;

/**
* 是否存在上一页
* @return
*/
public Boolean getPrevious() {
return previous;
}


/**
* 获取当前第几页��ȡ��ǰ
* @return
*/
public int getCurrentPage() {
return currentPage;
}

/**
* 是否存在下一页
* @return
*/
public Boolean getNext() {
return next;
}

/**
* 默认构造函数����Ϲ�����
*/
public Page(){

}


/**
* ����ÿ带每页数据条数的构造函数��С�Ĺ�����
*/
public void page(int pageSize){
this.pageSize = pageSize;
}

/**
* 获取总页数
* @return
*/
public int getPageCount() {
return pageCount;
}

/**
* ȡ�ܼ�¼��获取同的数据条数
*/
public int getTotalCount() {
return this.totalCount;
}

/**
* 设置当前页数
* @param currentPage
*/
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}

/**
* 设置总页数
* @param pageCount
*/
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}


/**
* 设置分页对象的属性值
* @param currentPage
* @param totalCount
*/
public void calculatePageInfo(int currentPage,int totalCount){
this.totalCount = totalCount;
this.currentPage = currentPage;
this.pageCount = this.getTotalPageCount();
this.previous = this.hasPreviousPage();
this.next = this.hasNextPage();
}


/**
* ȡ��计算总页数
*/
public int getTotalPageCount() {
if (totalCount % pageSize == 0)
return totalCount / pageSize;
else
return totalCount / pageSize + 1;
}

/**
* 设置每页数据条数
*/
public int getPageSize() {
return pageSize;
}

/**
* ��判断是否存在下一页
*/
public boolean hasNextPage() {
return this.currentPage < this.pageCount ;
}

/**
* 判断是否存在上一页
*/
public boolean hasPreviousPage() {
return this.currentPage > 1;
}

/**
*
*
* @see #getStartOfPage(int,int)
*/
protected int getStartOfPage(int pageNo) {
return getStartOfPage(pageNo, DEFAULT_PAGE_SIZE);
}

/**
*
* @param pageNo
* @param pageSize
* @return
*/
public int getStartOfPage(int pageNo, int pageSize) {
return (pageNo - 1) * pageSize;
}

/**
* 获取分页的数据集合
* @return
*/
public List getResult() {
return date;
}

/**
* 设置分页数据集合
* @param date
*/
public void setResult(List date) {
this.date = date;
}

/**
* 设置数据总条数
* @param totalCount
*/
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
}

两种HibernateCommonImpDAO归纳了两种分页查询
/**
* 采用Criteria方式分页查询
* @param criteria Criteria对象
* @param page 传入的Page对象
* @return Page 分页对象
*/
@SuppressWarnings("unchecked")
public Page getPage(Criteria criteria, Page page) {
Assert.notNull(criteria);
CriteriaImpl impl = (CriteriaImpl) criteria;
Projection projection = impl.getProjection();
List<CriteriaImpl.OrderEntry> orderEntries;
try {
orderEntries = (List) BeanUtils.forceGetProperty(impl,
"orderEntries");
BeanUtils.forceSetProperty(impl, "orderEntries", new ArrayList());
} catch (Exception e) {
throw new InternalError(" Runtime Exception impossibility throw ");
}

// 总的数据行数
int totalCount = (Integer) criteria.setProjection(
Projections.rowCount()).uniqueResult();

criteria.setProjection(projection);
if (projection == null) {
criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
}

try {
BeanUtils.forceSetProperty(impl, "orderEntries", orderEntries);
} catch (Exception e) {
throw new InternalError(" Runtime Exception impossibility throw ");
}

List list = criteria.setFirstResult(
page.getStartOfPage(page.getCurrentPage(), page.getPageSize()))
.setMaxResults(page.getPageSize()).list();
page.setTotalCount(totalCount);
page.setResult(list);
log
.debug("total count:" + totalCount + " return count:"
+ list.size());
return page;
}

/**
* 采用HQL方式分页查询
* @param hql 查询HQL语句
* @param params 查询参数
* @param page 分页Page对象
* @return Page 分页对象
*/
@SuppressWarnings("deprecation")
public Page getPage(final String hql, final Object[] params, final Page page) {
return (Page) getHibernateTemplate().execute(new HibernateCallback() {
@SuppressWarnings("unchecked")
public Object doInHibernate(Session session) {
int count = 0;
String subHql = interceptive(hql);
if (subHql != null) {
log.debug("HQL = " + hql);
log.debug("SubHQL = " + subHql);
Query query = session.createQuery(subHql);
setParamForQuery(query, params);
if (query.uniqueResult() != null)
count = Integer.parseInt(query.uniqueResult()
.toString());
}
Query query = session.createQuery(hql);
setParamForQuery(query, params);
List result = query.setFirstResult(
page.getStartOfPage(page.getCurrentPage(), page
.getPageSize())).setMaxResults(
page.getPageSize()).list();
page.setTotalCount(count);
page.setResult(result);
page.calculatePageInfo(page.getCurrentPage(), page
.getTotalCount());
return page;
}
}, true);
}

怎么调用它们,茫然了。。。
...全文
362 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
xingqingwy 2012-08-01
  • 打赏
  • 举报
回复
页面代码要怎么写
lzs109 2010-09-04
  • 打赏
  • 举报
回复
哈哈哈,学习,谢谢
chissie 2010-07-14
  • 打赏
  • 举报
回复
问题已解决 ,特别感谢xiamuchenfeng(旭旭)的大力支持!
setParamForQuery(query, params);
这个方法有问题,所以参数一直报错
androidmvc 2010-07-13
  • 打赏
  • 举报
回复
public void testHQL(){
Session session = super.getSession();
Query query = session.createQuery("FROM User").setFirstResult(0).setMaxResults(5).list();

List list = query.list();


为什么不用自带的分页。。。。



  • 打赏
  • 举报
回复
这分页写的还行。
虽然没我写的好。!~
chissie 2010-07-13
  • 打赏
  • 举报
回复
final Object[] params 参数该怎么用
我的查询参数就是一个userName,
if (parameters != null) {
for (int i = 0; i < parameters.length; i++) {
query.setParameter(i, parameters[i]);
}
这个方法应该怎么用上userName呢?
在action中写query.setParameter("userName", "%"+userName+"%")么?
谁能帮我写个关于Object[] params 的简单实例? 帮帮忙啊~~~ 大师们
chissie 2010-07-13
  • 打赏
  • 举报
回复

public Page getPages(String userID){

String hql ="from LoginResource where userID like ? order by userID";

String strparm=null;
if(null!=userID)
{
strparm= "%"+userID+"%";
}
else
{
strparm= "%%";
}
Object[] params=new Object[]{strparm};
Page p=new Page();
p.setCurrentPage(1);
p.setPageSize(10);
Page page=this.getPage(hql, params, p);
return page;

}


Servlet.service() for servlet framework threw exception
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '10 loginresou0_.ID as ID0_, loginresou0_.userID as userID0_, loginresou0_.pwd as' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.Util.getInstance(Util.java:381)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3515)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3447)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1951)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2101)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2554)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1761)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1912)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1808)
at org.hibernate.loader.Loader.doQuery(Loader.java:697)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.doList(Loader.java:2228)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125)
at org.hibernate.loader.Loader.list(Loader.java:2120)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:361)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1148)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
at com.sofmit.sd.framework.common.dao.HibernateCommonImpDAO$1.doInHibernate(HibernateCommonImpDAO.java:310)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:387)
at com.sofmit.sd.framework.common.dao.HibernateCommonImpDAO.getPage(HibernateCommonImpDAO.java:291)
at com.sofmit.sd.login.dao.UserDAO.getPages(UserDAO.java:71)
at com.sofmit.sd.login.service.UserServiceImpl.getUserPage(UserServiceImpl.java:90)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy22.getUserPage(Unknown Source)
at com.sofmit.sd.login.web.UserController.pageUser(UserController.java:92)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:421)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:136)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:326)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:313)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:852)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:584)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1508)
at java.lang.Thread.run(Thread.java:619)


始终还是参数有问题
闭目鱼 2010-07-13
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 chissie 的回复:]
改成String hql = "from LoginResource where userID like:userID";
是这个错 Servlet.service() for servlet framework threw exception
java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based!
说是参数多了。呵呵 ~~最初的错误,还是这个错看起来顺眼点。至少还明白啥意思,就是不明白咋改?
[/Quote]

现在问题就在于你的Object[] params=new Object[]{strparm};里面参数的封装了
query.setParameter("参数名(也就是“:”后面的)","值");
例如
query.setParameter("userID","%"+userID+"%");
chissie 2010-07-13
  • 打赏
  • 举报
回复
/**
* 默认的每页显示数据条数
*/
private static int DEFAULT_PAGE_SIZE = 10;

/**
* 每页显示数据
*/
private int pageSize = DEFAULT_PAGE_SIZE;

pageSize只有get方法 没set方法,page.java已经定义了pageSize,个人觉得不需要了吧。


我QQ号 236539110
加时请留一个CSDN吧。谢谢各位热心帮助, 感动啊~~~~
wanghao198612 2010-07-13
  • 打赏
  • 举报
回复
Page p=new Page();
p.setCurrentPage(0);
* p.setPageSize(10)) *
分页参数少了一个。。
xiamuchenfeng 2010-07-13
  • 打赏
  • 举报
回复
这么解决问题太慢了,你用断点跟一下,看看是哪行报错了,再看看那行为什么出错!要不咱们就用QQ解决一下!
chissie 2010-07-13
  • 打赏
  • 举报
回复
改成String hql = "from LoginResource where userID like:userID";
是这个错 Servlet.service() for servlet framework threw exception
java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based!
说是参数多了。呵呵 ~~最初的错误,还是这个错看起来顺眼点。至少还明白啥意思,就是不明白咋改?


where后去掉,把参数设为空
public Page getPages(String userID){

String hql ="from LoginResource";
String strparm=null;
//if(null!=userID)
//{
// strparm= "%"+userID+"%";
//}
//else
//{
// strparm= "%a%";
//}
Object[] params=new Object[]{strparm};
Page p=new Page();
p.setCurrentPage(0);
Page page=this.getPage(hql, params, p);
return page;

}

报这个错java.lang.IllegalArgumentException: No positional parameters in query: select count(*) from LoginResource


看出来了,就这hql写法有问题,换个写法换个错。怎么写才好呢?
闭目鱼 2010-07-13
  • 打赏
  • 举报
回复
另外 可否把你的
interceptive()和setParamForQuery()方法 贴出来看看
闭目鱼 2010-07-13
  • 打赏
  • 举报
回复
HQL语句改成

String hql = "from LoginResource where userID like:userID";
xiamuchenfeng 2010-07-13
  • 打赏
  • 举报
回复
你把where 后边的去掉试试看 还报错不?
chissie 2010-07-13
  • 打赏
  • 举报
回复
需要LoginResource.hbm.xml和LoginResource的持久化类么?
数据表就三字段ID userID pwd ,userID 不是外键,就是相当于userName的一个string型字段
'0 loginresou0_.ID as ID0_, loginresou0_.userID as userID0_, loginresou0_.pwd
这段东西是什么呢? 想不通
chissie 2010-07-13
  • 打赏
  • 举报
回复
hql这样子的String hql ="from LoginResource where userID like ?"

嗯~~ 我也不知道0是什么,怎么冒出来的 ,被这错搞的一片茫然
xiamuchenfeng 2010-07-13
  • 打赏
  • 举报
回复
你的hql 语句怎么写的呢?应该是语句写的有问题!
simaa0106 2010-07-13
  • 打赏
  • 举报
回复
'0 loginresou0_.ID as ID0_, loginresou0_.userID as userID0_, loginresou0_.pwd as

0这是什么?
jdjwxj 2010-07-13
  • 打赏
  • 举报
回复
来学习
加载更多回复(11)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧