java hibernate 分页查询_Hibernate 分页 查询

昨天的作业  分页:

主要的代码块:(明天实现分页的封装)

1 packagecom.cy.beans;2

3 importjava.util.List;4

5 /**

6 * 定义一个分页对象7 *@authoracer8 *9 */

10 public classPager {11

12 private int page;//当前页码

13 private int pageTotal;//总页码

14 private int rowsTotal;//总条数

15 private int rows;//每页显示条数

16 private String hql;//分页语句

17 private List> list;//返回的数据集合

18

19

20 publicPager() {21 super();22 }23

24 publicString getHql() {25 returnhql;26 }27

28

29

30 public voidsetHql(String hql) {31 this.hql =hql;32 }33

34

35

36 public intgetPage() {37 returnpage;38 }39 public void setPage(intpage) {40 this.page =page;41 }42 public intgetPageTotal() {43 returnpageTotal;44 }45 public void setPageTotal(intpageTotal) {46 this.pageTotal =pageTotal;47 }48 public intgetRowsTotal() {49 returnrowsTotal;50 }51 public void setRowsTotal(introwsTotal) {52 this.rowsTotal =rowsTotal;53 pageTotal = rowsTotal%rows==0 ? rowsTotal/rows : rowsTotal/rows+1;54 }55 public intgetRows() {56 returnrows;57 }58 public void setRows(introws) {59 this.rows =rows;60 }61 public List>getList() {62 returnlist;63 }64 public void setList(List>list) {65 this.list =list;66 }67

68

69 @Override70 publicString toString() {71 return "Pager [list=" + list + ", page=" + page + ", pageTotal="

72 + pageTotal + ", rows=" + rows + ", rowsTotal=" +rowsTotal73 + "]";74 }75

76

77 }

UserDaoImpl.java中的分页方法代码:

1 public Pager pagerff(Pager p, Mappram) {2 Session session = null;3 Transaction tx = null;4 try{5 session=HibernateUtils.getSessionFactory().openSession();6 tx=session.beginTransaction();7 String hql=p.getHql();//获取查询语句

8 Query query= session.createQuery(hql).setCacheable(true);9 //设置参数

10 query.setProperties(pram);11 //查询具体数据

12 int count=query.list().size();13 p.setRowsTotal(count);14 int nowPage=1;15 if(p.getPage()>0){16 nowPage=p.getPage();17 }18 //指定从那个对象开始查询,参数的索引位置是从0开始的,

19 query.setFirstResult((p.getPage()-1)*p.getRows());20 //分页时,一次最多产寻的对象数

21 query.setMaxResults(p.getRows());22 List> list1=query.list();23 p.setList(list1);24 tx.commit();25

26 } catch(Exception e) {27 e.printStackTrace();28 tx.rollback();29 }finally{30 session.close();31 }32 returnp;33 }

这个分页里主要使用了两个方法。

setFirstResult():设置从哪条数据开始查询的(分页的索引是从0开始的);

setProperties():设置每页显示的条数。

hibernate查询实现

hibernate中查询对象的方式有:OID查询,HQL查询,标准对象(条件)查询,本地sql查询。

使用例子UserBean.java

1 packagecom.cy.beans;2

3 importjava.io.Serializable;4

5 public class UserBean implementsSerializable {6

7 private static final long serialVersionUID = 1L;8

9 privateInteger id;10 privateString userName;11 privateString password;12 publicUserBean() {13 super();14 }15

16 publicInteger getId() {17 returnid;18 }19

20 public voidsetId(Integer id) {21 this.id =id;22 }23

24 publicString getUserName() {25 returnuserName;26 }27 public voidsetUserName(String userName) {28 this.userName =userName;29 }30 publicString getPassword() {31 returnpassword;32 }33 public voidsetPassword(String password) {34 this.password =password;35 }36 @Override37 publicString toString() {38 return "UserBean [id=" + id + ", userName=" + userName + ", password="

39 + password + "]";40 }41

42

43 }

先要定义IUserDao.java的接口。

一:OID查询:就是根据对象的id来查询(主要看看UserDaoImpl.java中实现的方法)

1 public UserBean getUser(Class>cls, Serializable pk) {2 //Class> cls 泛型,表示某一类的Object。

3 Session session = null;//获得session

4 Transaction tx = null;//事务

5 UserBean user=null; //对象

6 try{7 session=HibernateUtils.getSessionFactory().openSession();8 tx=session.beginTransaction();//开启事务

9 user=(UserBean)session.get(cls, pk);//查询 这里的pk指的就是id

10 tx.commit();//提交事务

11 } catch(Exception e) {12 e.printStackTrace();13 tx.rollback();//回滚事务

14 }finally{15 session.close();//关闭session

16 }17 returnuser;18 }

二:HQL查询:

hql(Hibernate Query Language)是一种面向对象的查询语言。也是在Hibernate应用最广的一种查询方式。

完整的HQL语法:

Select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc

示例1:

UserDaoImpl.java

1 public List> findUser(String sql, Mappram) {2 Session session = null;3 Transaction tx = null;4 List> list=null;5 try{6 session=HibernateUtils.getSessionFactory().openSession();7 tx=session.beginTransaction();8 Query query= session.createQuery(sql).setCacheable(true);

9 String userName=pram.get("userName").toString();10 String password=pram.get("password").toString();11 query.setString("userName", '%'+userName+'%');12 query.setString("password",password);13 list=query.list();14 tx.commit();15

16 } catch(Exception e) {17 e.printStackTrace();18 tx.rollback();19 }finally{20 session.close();21 }22 returnlist;23 }

UserServerImpl.java

1 @Override2 public List> findUser(Mappram) {3 //模糊查询

4 String hql="from UserBean where 1=1 and userName like :userName and password =:password";5 returniusUserDao.findUser(hql, pram);6 }

示例2:(这个就直接写了)

String hql="from UserBean as user where user.userName='kitty2'";

Query query=session.createQuery(hql);

List userList=query.list();

通过上面的例子可以看出HQL查询的基本操作步骤为:

1 创建Query对象: Query query= session.createQuery(sql)

2  动态绑定参数

3 通过调用Query对象的list()方法执行查询数据

注意:HQL语句本身大小写无关,但是其中出现的类名和属性名必须注意大小写区分。

三:条件查询:主要用了Criteria,Criterion接口,Expression和Restrictions类组成。

UserDaoImpl.java

1 @Override2 public List> findUser(Class>cls, String userName) {3 Session session = null;4 Transaction tx = null;5 List> list=null;6 try{7 session=HibernateUtils.getSessionFactory().openSession();8 tx=session.beginTransaction();9 //通过session的createCriteria()方法创建Criteria对象

10 Criteria criteria =session.createCriteria(cls);11 //设定查询条件12 //(String propertyName, String value, MatchMode matchMode)

13 /*MatchMode.START:字符串在最前面的位置.相当于"like 'value%'"14 MatchMode.END:字符串在最后面的位置.相当于"like '%value'"15 MatchMode.ANYWHERE:字符串在中间匹配.相当于"like '%value%'"16 MatchMode.EXACT:字符串精确匹配.相当于"like 'value'"*/

17 criteria.add(Restrictions.like("userName", userName, MatchMode.ANYWHERE));18 //调用Criteria类的list()方法执行查询

19 list =criteria.list();20 tx.commit();21

22 } catch(Exception e) {23 e.printStackTrace();24 tx.rollback();25 }finally{26 session.close();27 }28 returnlist;29 }

通过以上可以看出使用这个方法来查询数据有个局限就是要在session的条件下才可以。所以我们通常是使用离线条件查询

离线条件查询:DetachedCriteria(离线条件查询),可以脱离Session对象单独存在。(在项目中也多用离线条件查询)。

示例:

1 @Override2 public List> findUser(Class>cls, String userName) {3 Session session = null;4 Transaction tx = null;5 List> list=null;6 try{7 session=HibernateUtils.getSessionFactory().openSession();8 tx=session.beginTransaction();9 DetachedCriteria dc=DetachedCriteria.forClass(cls);10 //创建条件查询

11 dc.add(Restrictions.eq("userName", "kitty"));12 //绑定当前的session

13 Criteria c=dc.getExecutableCriteria(session);14 list=c.list();15 tx.commit();16

17 } catch(Exception e) {18 e.printStackTrace();19 tx.rollback();20 }finally{21 session.close();22 }23 returnlist;24 }

Restrictions常用限定查询方法:

Restrictions.eq 等于

Restrictions.allEq 使用Map,使用key/value进行多个等于的比对

Restrictions.gt 大于 >

Restrictions.ge 大于等于 >=

Restrictions.lt 小于 <

Restrictions.le 小于等于 <=

Restrictions.between 对应SQL的BETWEEN子句

Restrictions.like 对应SQL的LIKE子句

Restrictions.in 对应SQL的in子句

Restrictions.and and关系

Restrictions.or or关系

四:本地SQL查询

对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口。

String sql="select * from t_user";

SQLQuery query=session.createSQLQuery(sql);

query.addEntity(UserBean.class);

list=query.list();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值