关闭

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

100人阅读 评论(0) 收藏 举报
分类:

作为老牌的 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,是相通的。

   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号


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:148684次
    • 积分:2797
    • 等级:
    • 排名:第13311名
    • 原创:112篇
    • 转载:165篇
    • 译文:0篇
    • 评论:31条
    我的邮箱
    wshi_zhangyan@163.com
    博客专栏