• 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 = getSession().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 = getSession().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 = getSession().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 = getSession().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 = getSession().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(getSession());
            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】 

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段 声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 

  • 相关阅读:
    个人永久性免费-Excel催化剂自定义函数实现带命名空间的xml文件元素信息提取
    拥有它从此看英文世界网页效率倍增,不会英文也能闯天下
    【功能迭代】Excel催化剂批量下载邮件信息及正文续篇
    个人永久性免费-Excel催化剂第130波批量下载邮件信息及正文
    [功能发布]Excel集成网页控件,内嵌于Excel单元格区域,可加载任意网页
    使用VBA时不妨借力Excel催化剂的能力,让你的开发更加轻松便捷
    介绍一个不错的轮子:MoreLINQ,原生LINQ增强,尤其适用于数据ETL/数据分析领域。
    [功能更新]PBI催化剂新增批量DAX表达式格式化及模型和报表层度量值使用状况分析
    [网页采集实战]使用Excel催化剂趴一下公众号里的各种软文,越是大号越没底线
    【综合实战】使用Excel催化剂低成本快速轻松搭建复杂灵活的高响应的业务系统-EasyShu激活码发放过程
  • 原文地址:https://www.cnblogs.com/AACgao/p/6017241.html
Copyright © 2020-2023  润新知