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
唉没人指导啊... 展开
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
唉没人指导啊... 展开
3个回答
展开全部
第一个是从第几条开始,第二个是每页几条。
你看看你数据库里面的数据够不够分页,你这样只写两句就分页是不够的。
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;
}
你看看你数据库里面的数据够不够分页,你这样只写两句就分页是不够的。
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 广告
2024-07-18 广告
在Excel中,使用`VLOOKUP`函数进行单一条件查找非常常见,但`VLOOKUP`本身并不直接支持双重条件。然而,你可以通过一些间接方法实现。一种方法是将两个条件合并为一个标识符(例如,通过连接或串联),然后在另一个区域中查找此标识符...
点击进入详情页
本回答由TableDI提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询