这里使用两种查询方法
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 ();//获得结果