hibernate访问oracle分页SQL语句rownum子查询问题 10

hibernate3连接oracle10G,分页代码:Queryquery=session.createQuery(hql);query.setFirstResult(s... hibernate3连接oracle10G, 分页代码:
Query query = session.createQuery(hql);
query.setFirstResult(start);
query.setMaxResults(pageSize);
if (params != null) for (int i = 0; i < params.length; i++){
query.setParameter(i, params[i]);
}
return query.list();

网上查了很多资料, 根据hql生成的SQL应该是2层的rownum子查询嵌套用户hql
select * from (select * from (select * from table where a=1) row_ where rownum <= ?) rownum > ?

我现在从console看见的SQL和数据库里监控到的SQL语句都一样, 只有1层
select * from (select * from table where a=1) where rownum <= ?

如果只有一层rownum子查询的话, 数据库会将第一行数据到分页数据范围为止的数据全部传输到应用, 然后Hibernate会将分页数据范围之前的数据全部抛弃掉.
如数据量较大, 会造成数据库性能的极大浪费. (Hibernate内部机制不明, 仅个人猜测)

方言方面Oracle9Dialect和OracleDialect都试过, 结果相同. 是否需要设置特别的选项, 或者属性之类?

请高人指教 m(_ _)m
唉没人指导啊...
展开
 我来答
woshixushigang
2011-06-18 · TA获得超过279个赞
知道小有建树答主
回答量:341
采纳率:100%
帮助的人:176万
展开全部
第一个是从第几条开始,第二个是每页几条。
你看看你数据库里面的数据够不够分页,你这样只写两句就分页是不够的。
page = Paginator.showPage(dao, hql, paramValues, pageCurrent, pageSize);

/*
* 利用hql实现翻页
*/
public static Page showPage(PersistentBaseDao pdao, String hql,
Object[] paramValues, int pageCurrent, int pageSize) {
// 入口参数校验(无)
if (pdao == null) {
// log.debug("Paginator.pdao.hql is Empty");
}
if (hql.equals("") || hql == null) {
// log.debug("Paginator.showPage.hql is Empty");
}
if (pdao == null) {
// log.debug("Paginator.showPage.pdao is Empty");
}
PersistentBaseDao dao = (PersistentBaseDao) pdao;
// 如果当前页大于>总的页数,则让当前页等于总页数
int tempPageCount =0;

if (paramValues == null) {
tempPageCount = dao.getPageCount(hql, (Object[]) null, pageSize);
} else {
tempPageCount= dao.getPageCount(hql, paramValues, pageSize);
}
if (pageCurrent > tempPageCount) {
pageCurrent = tempPageCount;
}
// 如果当前页大于<1,则让当前页等于1
if (pageCurrent < 1) {
pageCurrent = 1;
}
// 调用dao.serarch()方法
if (paramValues == null) {
page = dao.search(hql, pageCurrent, pageSize);
} else {
page = dao.search(hql, paramValues, pageCurrent, pageSize);
}
// 为page对象设置当前页的属性
page.setPageCurrent(pageCurrent);
// 将page对象放在request对象中
return page;
}

/*
* 利用List实现翻页
*/
@SuppressWarnings("unchecked")
public static Page showPage(List list, int pageCurrent, int pageSize) {
// 入口参数校验(无)
if (list.isEmpty()) {
// log.debug("Paginator.showPage.list is Empty");
}
// 如果当前页大于>总的页数,则让当前页等于总页数
if (pageCurrent > page.getPageCount()) {
pageCurrent = page.getPageCount();
}
// 如果当前页大于<1,则让当前页等于1
if (pageCurrent < 1) {
pageCurrent = 1;
}
List ls = new ArrayList();
// 根据得到的list转化为page对象
if (list.size() % pageSize == 0) {
page.setPageCount((list.size() / pageSize));
} else {
page.setPageCount((list.size() / pageSize) + 1);
}
page.setPageCurrent(pageCurrent);
page.setRecordCound(list.size());
int stag = (pageCurrent - 1) * pageSize;
int etag = pageCurrent * pageSize;
for (int i = stag; i < list.size() && i < etag; i++) {
ls.add(list.get(i));
}
page.setDataList(ls);
return page;
}
追问
纠正一下:
setFirstResult(int) 是设置从结果集第几行开始取数据, 如大于结果集行数, 返回空List
setMaxResults(int) 是设置最多取几行数据, 如剩余记录不足设置行数, 返回实际行数

我的问题跟代码无关, 分页功能都正常, 只是想知道为什么我生成的SQL有问题.
我猜想是配置文件问题.
TableDI
2024-07-18 广告
在Excel中,使用`VLOOKUP`函数进行单一条件查找非常常见,但`VLOOKUP`本身并不直接支持双重条件。然而,你可以通过一些间接方法实现。一种方法是将两个条件合并为一个标识符(例如,通过连接或串联),然后在另一个区域中查找此标识符... 点击进入详情页
本回答由TableDI提供
dmeigcv
2011-06-19 · TA获得超过1803个赞
知道小有建树答主
回答量:1761
采纳率:0%
帮助的人:261万
展开全部
hibernate 分页有一个封装好了的方法,叫什么 maxreslut 我既不清楚了。

你上网搜一下hibernate分页实现吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jsjsuperman123
2012-07-07 · TA获得超过375个赞
知道小有建树答主
回答量:285
采纳率:0%
帮助的人:274万
展开全部
我也遇到了类似的问题
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式