Hibernate中使用detachedCriteria.addOrder(Order.desc 错误 hibernate排序
来源:互联网 发布:程序员背包推荐 编辑:程序博客网 时间:2024/06/12 18:50
文章转载自:http://blog.csdn.net/newfox/article/details/762447
原来开发的时候我是用的mysql,没有任何问题。原因就在最后面的order by 语句,sql server 在select count(*)里面不能用 order by。然后跟踪代码发现:
public PaginationSupport getBlogsByCategoryByPage(final String categoryId, final int startIndex, final int pageSize) {
return (PaginationSupport) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Criteria criteria = session.createCriteria(Blog.class);
Criteria cateCriteria = criteria.createCriteria("categories");
cateCriteria.add(Expression.eq("id",categoryId));
criteria.addOrder(Order.desc("postTime"));
int totalCount = ((Integer) criteria.setProjection(Projections.rowCount())
.uniqueResult()).intValue();
criteria.setProjection(null);
List items = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();
List blogs = new ArrayList();
for(Iterator ite = items.iterator(); ite.hasNext();) {
Object[] objs = (Object[])ite.next();
blogs.add(objs[1]);
}
PaginationSupport ps = new PaginationSupport(blogs, totalCount, pageSize, startIndex);
return ps;
}
}, true);
}
原 来问题就在Criteria.addOrder(Order.desc("postTime"));这句话的位置上面,int totalCount = ((Integer) criteria.setProjection(Projections.rowCount())return (PaginationSupport) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Criteria criteria = session.createCriteria(Blog.class);
Criteria cateCriteria = criteria.createCriteria("categories");
cateCriteria.add(Expression.eq("id",categoryId));
criteria.addOrder(Order.desc("postTime"));
int totalCount = ((Integer) criteria.setProjection(Projections.rowCount())
.uniqueResult()).intValue();
criteria.setProjection(null);
List items = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();
List blogs = new ArrayList();
for(Iterator ite = items.iterator(); ite.hasNext();) {
Object[] objs = (Object[])ite.next();
blogs.add(objs[1]);
}
PaginationSupport ps = new PaginationSupport(blogs, totalCount, pageSize, startIndex);
return ps;
}
}, true);
}
.uniqueResult()).intValue();
这句话的时候就会生成上面那句话,如果在这之前addOrder就会出现问题,如果你用mysql不会出现问题,如果你用sql server就会报错。解决方法就是把addOrder语句放到totalCount下面就可以了。
public PaginationSupport getBlogsByCategoryByPage(final String categoryId, final int startIndex, final int pageSize) {
return (PaginationSupport) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Criteria criteria = session.createCriteria(Blog.class);
Criteria cateCriteria = criteria.createCriteria("categories");
cateCriteria.add(Expression.eq("id",categoryId));
int totalCount = ((Integer) criteria.setProjection(Projections.rowCount())
.uniqueResult()).intValue();
criteria.setProjection(null);
/*
* Fix a bug ,Order must add after get the totalCount,
* beacuse SqlServer not support order by in the select count(*).
*/
criteria.addOrder(Order.desc("postTime"));
List items = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();
List blogs = new ArrayList();
for(Iterator ite = items.iterator(); ite.hasNext();) {
Object[] objs = (Object[])ite.next();
blogs.add(objs[1]);
}
PaginationSupport ps = new PaginationSupport(blogs, totalCount, pageSize, startIndex);
return ps;
}
}, true);
}
return (PaginationSupport) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Criteria criteria = session.createCriteria(Blog.class);
Criteria cateCriteria = criteria.createCriteria("categories");
cateCriteria.add(Expression.eq("id",categoryId));
int totalCount = ((Integer) criteria.setProjection(Projections.rowCount())
.uniqueResult()).intValue();
criteria.setProjection(null);
/*
* Fix a bug ,Order must add after get the totalCount,
* beacuse SqlServer not support order by in the select count(*).
*/
criteria.addOrder(Order.desc("postTime"));
List items = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();
List blogs = new ArrayList();
for(Iterator ite = items.iterator(); ite.hasNext();) {
Object[] objs = (Object[])ite.next();
blogs.add(objs[1]);
}
PaginationSupport ps = new PaginationSupport(blogs, totalCount, pageSize, startIndex);
return ps;
}
}, true);
}
这样生成的sql语句就是这样的。
select count(*) as y0_ from myblog_Blog this_ inner join myblog_Blog_Category categories3_ on this_.id=categories3_.blogId inner join myblog_Category category1_ on categories3_.categoryId=category1_.id where category1_.id=?
以后大家也要注意了。呵呵。
感谢分享
- Hibernate中使用detachedCriteria.addOrder(Order.desc 错误 hibernate排序
- 关于Hibernate的DetachedCriteria查询的addOrder问题的解决办法
- Hibernate中DetachedCriteria的使用
- Hibernate中DetachedCriteria的使用
- Hibernate中DetachedCriteria的使用
- Hibernate中DetachedCriteria的使用
- Hibernate中DetachedCriteria的使用
- Hibernate中DetachedCriteria的使用
- Hibernate Criteria 查询---addOrder用法添加排序
- Hibernate Criteria 查询---addOrder用法添加排序
- [转]Hibernate中DetachedCriteria的使用
- Hibernate中DetachedCriteria的使用 (转载)
- Hibernate中Criteria、DetachedCriteria
- hibernate使用DetachedCriteria案例
- postgresql上Hibernate的DetachedCriteria同时添加addOrder和Projections.rowCount()运行出错。
- hibernate中Criteria和DetachedCriteria
- Hibernate中DetachedCriteria的用法
- hibernate detachedcriteria
- mysql读写分离(MySQL Proxy 安装和使用)
- C 语言面向对象编程 理论加实践 代码
- linux下安装sqlite3
- 使用MySQL Proxy解决MySQL主从同步延迟
- netbeans使用glassfish服务器的submittime参数。
- Hibernate中使用detachedCriteria.addOrder(Order.desc 错误 hibernate排序
- Flex整站开发Step by Step : 1、Preface
- scu 3998 photo shoot
- oracle database link 作用
- iis 中配置 域名登录 跳转页面
- Android Gallery3D源码分析(一)
- poj1716——Integer Intervals//差分约束系统
- Android Gallery3D源码分析(二)
- 过滤驱动容易让新手纠结的几个函数