您的位置:首页 > 其它

Hibernate 查询方式(HQL/QBC/QBE)汇总

2017-05-25 09:47 351 查看
 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 --> 工具类的方法进行统计和分组。

    上述 5-6 也是我最喜欢的方式,用面向对象查询方式来迎合面向对象的编程。

   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 查询方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: