`

Criteria分页查询消除重复行

 
阅读更多

业务要求:查询出所有除角色为管理员以外的所有用户

  public Pagination findUserList(final Pagination pagination , final String param)
	{
		 final List result = this.getHibernateTemplate().executeFind(
					new HibernateCallback() {
						public Object doInHibernate(final Session session)
								throws HibernateException, SQLException {
							Criteria criteria = DetachedCriteria.forClass(
									AmUserRole.class).getExecutableCriteria(
									session);
							Criteria userCriteria = criteria.createCriteria("amUser");
							Criteria roleCriteria = criteria.createCriteria("amRole");
 
                     //去除角色为管理员的用户
							roleCriteria.add(Restrictions.not(Expression.in(
                         "roleId",new Long[]{0L})));   
							userCriteria.add(Restrictions.like("name", "%"+param+"%"));
							//userCriteria.add(
                           //Restrictions.like("username",       
                              //param,MatchMode.ANYWHERE);
							
                      //查询去除重复行后的总记录数
				userCriteria.setProjection(Projections.countDistinct("userId")); 
	//hibernate3.0以后返回的是Long型	

	Integer totalCount = (Integer) criteria.uniqueResult(); 
							ProjectionList projectionList = Projections.projectionList();
	                  //决定返回的结果
						projectionList.add(Projections.property("amUser"));   
							criteria.setProjection(Projections.distinct(projectionList));
				
							userCriteria.addOrder(Order.asc("name"));
			    //判断是否需要分页
                            if(pagination.getPageSize() <= 0)
                            {
                            	return criteria.list();
                            }else{
                            	if(0 == pagination.getItemCount())
                            	{                  
                            		System.out.println("totalCount---->"+totalCount);
                            		pagination.setItemCount(totalCount);
                            	}
                            	int pageSize = pagination.getPageSize();
    							int pageNo = pagination.getCurrentPage();
    							int startIndex = pageSize * (pageNo - 1);
    							criteria.setFirstResult(startIndex);
    							criteria.setMaxResults(pageSize);
    							pagination.setPageSize(pageSize);
    							pagination.setCurrentPage(pageNo);
    							return criteria.list();
                            }
							
							
						}
					});
		    pagination.setItemList(result);
			return pagination;
			
	}

这样返回的结果就是用户表所映射的用户对象
分享到:
评论

相关推荐

    SSH框架的增,删,查,改,分页

    分页**:在SSH框架中,实现分页通常需要结合Spring的Pageable接口和Hibernate的Criteria API或HQL。通过设置每页大小和当前页数,查询出对应的数据范围。在JSP页面上,可以使用标签库如DisplayTag或JSTL来展示分页...

    strut+Hibernian分页程序

    Hibernate提供了Session接口,用于执行CRUD(创建、读取、更新、删除)操作,并且支持HQL(Hibernate查询语言)和SQL查询,方便数据检索。 分页在大数据量的应用中非常常见,它能提高用户体验并减少服务器负载。在...

    SSH实现分页模型和CRUD操作

    在分页场景下,我们可以使用Criteria或HQL(Hibernate Query Language)查询来实现,结合Criteria的setFirstResult和setMaxResults方法来实现分页。在CRUD操作中,Hibernate提供了一对一、一对多、多对多等关系的...

    ssh实现的购物车和分页功能

    在分页功能中,Hibernate提供 Criteria 查询或HQL(Hibernate Query Language)来实现分页查询,可以有效地获取指定页的数据,并控制查询性能,避免大数据量一次性加载。 购物车功能的实现通常涉及以下步骤: 1. ...

    hibernate代码优化基于配置的多表查询

    Hibernate的二级缓存能存储已查询过的数据,避免重复查询数据库。开启并配置二级缓存(如EhCache或Infinispan),可以显著提升性能。记得只对不变或更新频率低的数据使用缓存,避免脏数据问题。 3. **HQL与...

    【ASP.NET编程知识】基于Entity Framework自定义分页效果.docx

    在文档中,作者提供了一个名为`Find`的方法,该方法接受一个谓词表达式`criteria`用于定义查询条件,`pageIndex`和`pageSize`用于分页,以及`asc`和`desc`数组来指定排序方式。这种方法可以灵活地处理各种分页需求...

    超好用的hibernate查询工具类

    2. **条件查询**:通过传入HQL(Hibernate Query Language)或者Criteria API来实现动态查询。例如`public List&lt;T&gt; findByExample(T exampleEntity)`,可以基于一个实例对象的属性来构建查询条件。 3. **分页查询**...

    本人写的Hibernate超级通用DAO

    3. **分页查询**:在大型项目中,通常需要实现分页功能,我们可以提供`List&lt;T&gt; findPage(int pageSize, int currentPage, Criteria criteria)`方法,支持按条件分页查询。 4. **排序**:允许用户自定义排序规则,...

    java工程师面试题大全

    - **解决方案**: 在Hibernate的Criteria API中,可以通过调用`setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)`方法来去除查询结果中的重复项。这会确保查询结果只包含唯一的根实体对象。 #### 二、HTTP与...

    java软件工程师面试题

    Hibernate 提供了 `Criteria.DISTINCT_ROOT_ENTITY` 结果转换器,用于在查询时去除结果集中的重复实体。在 Criteria 查询中,添加 `dc.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);` 可以确保返回的实体...

    spring4+hibernate4 封装BaseDao增删改查以及分页,,支持jdk1.7,不支持jdk1.8

    项目中实现了分页功能,可能通过在Hibernate查询中添加限制条件(如`setFirstResult()`和`setMaxResults()`)或者使用`Criteria` API的`setFirstResult()`和`setMaxResults()`来实现。这使得用户可以按需加载数据,...

    Hibernate通用Dao设计。

    - **分页查询**:使用Criteria API或HQL实现分页查询,结合Page对象存储查询结果和分页信息。 3. **事务管理** - 为了保证数据的一致性,通常需要在通用DAO中处理事务。可以使用Spring的TransactionTemplate或者...

    hibernate3.3.zip

    Query接口提供HQL查询,可执行参数化查询、分页查询等。Criteria API提供面向对象的查询方式,更易于动态构造查询条件。 7. Criteria API详解: Criteria查询通过Criteria、DetachedCriteria等类构建,可设置限制...

    4个常见的JAVA J2EE 面试问题 源创

    这里通过两个嵌套的`SELECT`语句先找到所有重复记录的ID,再利用`MIN(rowid)`来确定每个组中最小的`rowid`,从而确保只删除重复记录。 #### 4. 日志框架Log4j配置 **题目:** Log4j的配置方式有哪些? **答案:** ...

    java面试总结 面试 基础题 SSH 数据库

    `rownum`是根据查询结果分配的逻辑编号,而`rowid`则是记录的物理位置,适用于快速定位和删除重复记录。 在面试中,了解这些基础题并能灵活运用是非常重要的,尤其是对于初入行业的开发者。面试官可能会通过这些...

    300+道中高级java工程师面试题大全含答案文档下载

    1. **Hibernate离线查询去除重复项**:在Hibernate中,使用Criteria API时,可以设置ResultTransformer为`Criteria.DISTINCT_ROOT_ENTITY`来去除查询结果中的重复实体。 2. **HTTP与SMTP协议及端口**:HTTP是用于...

    Java面试题

    Hibernate中的Criteria查询可以通过设置ResultTransformer为DISTINCT_ROOT_ENTITY来去除查询结果中的重复实体。`dc.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);` 这一行代码的作用是确保返回的实体结果...

    java面试大全

    Hibernate 提供了一个方便的方法来去除查询结果中的重复实体,即 `dc.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);` 这行代码会确保返回的实体结果是唯一的,避免了由于关联查询导致的重复数据。 2. **...

Global site tag (gtag.js) - Google Analytics