
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
昆明IT培训的老师知道作为老牌的ORM框架,Hibernate在推动数据库持久化层所做出的贡献有目共睹。
它所提供的数据查询方式也越来越丰富,从SQL到自创的HQL,再到面向对象的标准化查询。
虽然查询方式有点眼花缭乱,配置使用起来也稍微有点复杂。
但是丝毫掩盖不了它迷人的地方,本篇博客试着汇总Hibernate所有的查询方式。
萝卜青菜各有所爱,工作中可以根据自己的喜好选择其中的几种进行编程。
1. HQL方式,参数使用问号占位(4.1版本中已被废弃)
publicList<UserPO>getUserList(UserPO userPO) { String hql= "from UserPO where name = ? and passwd= ?"; Query query=getHibernateSession().createQuery(hql); query.setParameter(0, userPO.getName()); query.setParameter(1, userPO.getPasswd());returnquery.list(); }
2. HQL方式,参数使用命名占位
publicList<UserPO>getUserList(UserPO userPO) { String hql= "from UserPO where name = :userName and passwd= :userPwd"; Query query=getSession().createQuery(hql); query.setParameter("userName", userPO.getName()); query.setParameter("userPwd", userPO.getPasswd());returnquery.list(); }
3. HQL方式,参数使用JPA占位符
publicList<UserPO>getUserList(UserPO userPO) { String hql= "from UserPO where name = ?1 and passwd= ?2"; Query query=getSession().createQuery(hql); query.setParameter("1", userPO.getName()); query.setParameter("2", userPO.getPasswd());returnquery.list(); }
4. HQL方式,参数使用对象绑定
publicList<UserPO>getUserList(UserPO userPO) { String hql= "from UserPO where name = :name and passwd= :passwd"; Query query=getSession().createQuery(hql); query.setProperties(userPO);returnquery.list(); }
PS:需要注意的是命名参数占位要与PO属性一致,而且只能使用参数命名占位的方式。
当然上述的1--4填充查询方式,HQL都可以调整为SQL,是相通的。
5. QBC(Query By Criteria)方式,参数使用Restrictions对象
publicList<UserPO>getUserList(UserPO userPO) { Criteria criteria= getSession().createCriteria(UserPO.class); criteria.add(Restrictions.eq("name",userPO.getName())); criteria.add(Restrictions.eq("passwd",userPO.getPasswd()));returncriteria.list(); }
6. QBC(Query By Criteria)方式,参数使用对象绑定
publicList<UserPO>getUserList(UserPO userPO) { Criteria criteria= getSession().createCriteria(UserPO.class); criteria.add(Example.create(userPO));returncriteria.list(); }
PS: QBC(Query By Criteria)方式,使用到的关键抽象对象有:
Restrictions -->设置查询限制条件
Order -->设置查询排序条件
Projections -->工具类的方法进行统计和分组。
上述5-6也是我最喜欢的方式,用面向对象查询方式来迎合面向对象的编程。
7.离线条件查询
publicList<UserPO>getUserList(UserPO userPO) { DetachedCriteria detachedCriteria= DetachedCriteria.forClass(UserPO.class); detachedCriteria.add(Restrictions.eq("name",userPO.getName())); detachedCriteria.add(Restrictions.eq("passwd",userPO.getPasswd())); Criteria criteria=detachedCriteria.getExecutableCriteria(getSession());returncriteria.list(); }
离线查询的好处,可以将查询对象DetachedCriteria作为参数传递到DAO层,减少DAO层代码
8. QBC(Query By Criteria)方式,分页查询
publicList<UserPO>getUserList(UserPO userPO) { Criteria criteria= getSession().createCriteria(UserPO.class); criteria.setFirstResult(4); criteria.setMaxResults(3);returncriteria.list(); } }
PS:分页查询主要是要指定两个参数(从什么开始,取多少条):
Query或者Criteria对象的setFirstResult()和setMaxResults()
当然8中的Criteria 对象也可以换为Query对象,使用HQL或者SQL查询方式。