Hibernate 分页查询--DAO
这里使用两种查询方法
Hibernate中使用criteria进行条件查询
Hibernate中使用原始的SQL进行查询
查Hibernate中使用criteria进行条件查询还是很方便的
1 DetachedCriteria criteria = DetachedCriteria . forClass(Employee. class) ; 2 criteria.addOrder (Order. asc("employeeId" )); 3 criteria.setProjection (Projections.rowCount());// 设置查询的结果是总数 4 5 int totalRows = 6 ((Number) getHibernateTemplate().findByCriteria (criteria).get(0 )).intValue(); 7 8 criteria.setProjection ( null );//设置为 null这样查询的 结果就不是总数了 9 //criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 10 criteria.setResultTransformer (Criteria.ROOT_ENTITY ); //使用了关联类查询要设置这个,不然返回的是 object【】类型 11 employeeList= getHibernateTemplate().findByCriteria 12 (criteria, page.getStartIndex()-1, page.getPageSize());//分页查询 13 14 page.setTotalRecNum (totalRows); 15 page.setPageContent (employeeList);
Hibernate 使用原始的 sql 进行分页查询
如果查询的条件比较复杂,有关联到多张表的话,用 Hibernate的 Criteria或者 HQL查询多有不便。
如,1、各实体类之间没有设置关联 (数据库的外键没有很严格,数据库表太多了太复杂,设置外键的话,多有不便 )
2、有设置管理的话,有Criteria查询的话,会写的很复杂,不如 sql两行
这里使用 原始的 sql查进行分页查询
Sql 语句上面经过的拼接 这里不表
sqlFrom 是from aTable a,bTable b,cTable c 查询的表
sqlWhere 是 查询的条件
这里的sqlWhere 第一个条件一直为 true的先把参数写在都也在这里。因为 sqlWhere 的条件是拼接的,这些参数不定的会出现在后面
如果没有出现的参数使用 sqlQuery.setParameter赋值会报错。虽然用 sql 字符串 contains判断是否存在此参数,不过要写很多 if来判断,不如让他们都出现
String sqlWhere = " where ( 1=1 or :palnVer=:fsStatus or :empId=1 ) " + ""//不一定出現的變量
1 String countSql = "select count(*) " + sqlFrom + sqlWhere ;//先查詢總數 2 3 sqlQuery = session .createSQLQuery(countSql); 4 5 sqlQuery.setParameter ( "progId" , userInfo.getProgId()); //設置參數的值代碼 6 .... 7 int size = (Integer)sqlQuery .list(). get(0 ); 8 9 String dataSql = "select v.* " + sqlFrom + sqlWhere ;//查詢記錄 10 11 dataSql = dataSql + " ORDER BY v.PROJ_ID" ;//按projID升序 12 13 sqlQuery = session .createSQLQuery(dataSql); 14 15 sqlQuery.setFirstResult (newPager.getStartRow());//设置查询的起始记录 16 sqlQuery.setMaxResults (newPager.getPageSize());//设置查询的查询的条数 17 18 sqlQuery.addEntity ( "v" ,VwProjMaster.class );//设置查询的结果封装成对象 19 20 List<VwProjMaster > result= sqlQuery.list ();//获得结果