Hibernate 查询方式(HQL/QBC/QBE)汇总
2017-01-03 15:30
393 查看
作为老牌的 ORM 框架,Hibernate 在推动数据库持久化层所做出的贡献有目共睹。
它所提供的数据查询方式也越来越丰富,从 SQL 到自创的 HQL,再到面向对象的标准化查询。
虽然查询方式有点眼花缭乱,配置使用起来也稍微有点复杂。
但是丝毫掩盖不了它迷人的地方,本篇博客试着汇总 Hibernate 所有的查询方式。
萝卜青菜各有所爱,工作中可以根据自己的喜好选择其中的几种进行编程。
1. HQL 方式,参数使用问号占位(4.1 版本中已被废弃)
2. HQL 方式,参数使用命名占位
3. HQL 方式,参数使用 JPA 占位符
4. HQL 方式,参数使用对象绑定
PS:需要注意的是命名参数占位要与PO属性一致,而且只能使用参数命名占位的方式。
当然上述的 1--4 填充查询方式,HQL 都可以调整为SQL,是相通的。
5. QBC(Query By Criteria) 方式,参数使用 Restrictions 对象
6. QBC(Query By Criteria) 方式,参数使用对象绑定
PS: QBC(Query By Criteria) 方式,使用到的关键抽象对象有:
Restrictions --> 设置查询限制条件
Order --> 设置查询排序条件
Projections --> 工具类的方法进行统计和分组。
7. 离线条件查询
离线查询的好处,可以将查询对象 DetachedCriteria 作为参数传递到 DAO层,减少 DAO 层代码
8. QBC(Query By Criteria) 方式,分页查询
PS: 分页查询主要是要指定两个参数(从什么开始,取多少条):
Query或者Criteria对象的 setFirstResult()和setMaxResults()
当然8中的 Criteria 对象也可以换为 Query 对象,使用 HQL 或者 SQL 查询方式。
9. QBE(Query By Example) 方式,分页查询
ps:一般工作中使用的是7号
它所提供的数据查询方式也越来越丰富,从 SQL 到自创的 HQL,再到面向对象的标准化查询。
虽然查询方式有点眼花缭乱,配置使用起来也稍微有点复杂。
但是丝毫掩盖不了它迷人的地方,本篇博客试着汇总 Hibernate 所有的查询方式。
萝卜青菜各有所爱,工作中可以根据自己的喜好选择其中的几种进行编程。
1. HQL 方式,参数使用问号占位(4.1 版本中已被废弃)
public List<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()); return query.list(); }
2. HQL 方式,参数使用命名占位
public List<UserPO> getUserList(UserPO userPO) { String hql = "from UserPO where name = :userName and passwd= :userPwd"; Query query = getHibernateSession().createQuery(hql); query.setParameter("userName", userPO.getName()); query.setParameter("userPwd", userPO.getPasswd()); return query.list(); }
3. HQL 方式,参数使用 JPA 占位符
public List<UserPO> getUserList(UserPO userPO) { String hql = "from UserPO where name = ?1 and passwd= ?2"; Query query = getHibernateSession().createQuery(hql); query.setParameter("1", userPO.getName()); query.setParameter("2", userPO.getPasswd()); return query.list(); }
4. HQL 方式,参数使用对象绑定
public List<UserPO> getUserList(UserPO userPO) { String hql = "from UserPO where name = :name and passwd= :passwd"; Query query = getHibernateSession().createQuery(hql); query.setProperties(userPO); return query.list(); }
PS:需要注意的是命名参数占位要与PO属性一致,而且只能使用参数命名占位的方式。
当然上述的 1--4 填充查询方式,HQL 都可以调整为SQL,是相通的。
5. QBC(Query By Criteria) 方式,参数使用 Restrictions 对象
public List<UserPO> getUserList(UserPO userPO) { Criteria criteria = getHibernateSession().createCriteria(UserPO.class); criteria.add(Restrictions.eq("name",userPO.getName())); criteria.add(Restrictions.eq("passwd",userPO.getPasswd())); return criteria.list(); }
6. QBC(Query By Criteria) 方式,参数使用对象绑定
public List<UserPO> getUserList(UserPO userPO) { Criteria criteria = getHibernateSession().createCriteria(UserPO.class); criteria.add(Example.create(userPO)); return criteria.list(); }
PS: QBC(Query By Criteria) 方式,使用到的关键抽象对象有:
Restrictions --> 设置查询限制条件
Order --> 设置查询排序条件
Projections --> 工具类的方法进行统计和分组。
7. 离线条件查询
public List<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(getHibernateSession()); return criteria.list(); }
离线查询的好处,可以将查询对象 DetachedCriteria 作为参数传递到 DAO层,减少 DAO 层代码
8. QBC(Query By Criteria) 方式,分页查询
public List<UserPO> getUserList(UserPO userPO) { Criteria criteria = getSession().createCriteria(UserPO.class); criteria.setFirstResult(4); criteria.setMaxResults(3); return criteria.list(); } }
PS: 分页查询主要是要指定两个参数(从什么开始,取多少条):
Query或者Criteria对象的 setFirstResult()和setMaxResults()
当然8中的 Criteria 对象也可以换为 Query 对象,使用 HQL 或者 SQL 查询方式。
9. QBE(Query By Example) 方式,分页查询
Example exampleUser =Example.create(bc) .ignoreCase() //忽略大小写 .enableLike(MatchMode.ANYWHERE); //任意位置的匹配 Criteria crit = session.createCriteria(BasicCar.class); crit.add(exampleUser); List results = crit.list(); 这个查询相当于查询factory属性为"%aa%",即只要对factory属性值进行aaaa的模糊字符串匹配。
ps:一般工作中使用的是7号
相关文章推荐
- Hibernate 查询方式(HQL/QBC/QBE)汇总
- Hibernate 查询方式(HQL/QBC/QBE)汇总
- Hibernate 查询方式(HQL/QBC/QBE)汇总
- Hibernate的几种查询方式 HQL,QBC,QBE,离线查询,复合查询,分页查询
- Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询
- Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询
- Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询
- Hibernate查询_HQL_EJBQL_QBC_QBE
- Hibernate通常是三种:hql查询,QBC查询和QBE查询:
- Hibernate(十五)HQL与QBC查询方式详解
- Hibernate学习-07:CRUD(增删改查)操作之查询多条/所有记录HQL、QBC、SQL三种方式
- Hibernate的集中查询方式 : hql查询,QBC查询和QBE查询
- Hibernate(十五)HQL与QBC查询方式详解
- Hibernate查询_HQL_EJBQL_QBC_QBE
- hibernate查询精典例子(HQL QBC QBE)
- Java程序员从笨鸟到菜鸟之(六十四)细谈Hibernate(十五)HQL与QBC查询方式详解
- HQL和QBC和QBE + hibernate检索方式
- Hibernate 检索查询的几种方式(HQL,QBC,本地SQL,集成Spring等)
- Hibernate查询(Query Language,hql,ejbql,nativeql,qbc,qbe)
- Java程序员从笨鸟到菜鸟之(六十四)细谈Hibernate(十五)HQL与QBC查询方式详解