Hibernate 查询方式(HQL/QBC/QBE)汇总
作为老牌的 ORM 框架,Hibernate 在推动数据库持久化层所做出的贡献有目共睹。
它所提供的数据查询方式也越来越丰富,从 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 是相通的(使用 createSQLQuery)。
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 --> 工具类的方法进行统计和分组。
上述 5-6 也是我最喜欢的方式,用面向对象查询方式来迎合面向对象的编程。
当查询条件中都是等于的时候,使用方法6,代码是相当简洁优雅的。
如果查询条件中含有其他判断限制,如>、<、like、between 时,使用方式 5 也是不错的选择。
但出现特殊情况,如属性字段为时间类型,因各数据库对时间字段的的规范和类型不同。
填充 PO 时间类型属性后,无法精准的使用方式 5/6 进行时间查询的判断限制,这时需要从 1-4 方式中变通一下。
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 查询方式。
作者:Orson
出处:http://www.cnblogs.com/java-class/
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】
如果,您对我的博客内容感兴趣,请继续关注我的后续博客,我是【Orson】
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段
声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。