关闭

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

162人阅读 评论(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
查看评论

Hibernate通常是三种:hql查询,QBC查询和QBE查询:

通常使用的Hibernate通常是三种:hql查询,QBC查询和QBE查询: 1、QBE(Qurey By Example)检索方式 QBE是最简单的,但是功能也是最弱的,QBE的功能不是特别强大,仅在某些场合下有用。一个典型的使用场合就是在查询窗口中让用户输入一系列的查询条件,然后返回匹配的对象。...
  • u010741376
  • u010741376
  • 2016-06-08 16:18
  • 948

Hibernate的HQL、QBC、QBE查询总结

一、HQL查询HQL的应用最为广泛,是最为常用的,跟SQL语句差不多,区别是: SQL基于表和字段查询,HQL基于类对象和属性查询HQL的功能大概有: 属性查询、分组查询、动态实例查询(比较具备特点)、分页查询、条件查询、连接查询、子查询属性查询属性查询要注意的地方是,查询的结果会封装为一个Ob...
  • jeffleo
  • jeffleo
  • 2017-01-05 17:02
  • 397

Hibernate深入理解----Hibernate 检索方式(HQL,QBC,本地SQL)

参考代码下载github:https://github.com/changwensir/java-ee/tree/master/hibernate4 •Hibernate 提供了以下几种检索对象的方式     –导航对象图检索方式:  根据已经加...
  • oChangWen
  • oChangWen
  • 2016-09-20 22:47
  • 1534

Hibernate QBC与HQL优缺点

QBC 全称:Query By Criteria HQL 全称:Hibernate Query Language HQL优点:与sql相近,可读性好,功能强大,效率高。 HQL缺点:字符串形式,只有在运行时才被解析,扩展性差。 QBC优点:提供面向对象的接口,编译时就可被解析,便于排错调试,...
  • dongkai_it
  • dongkai_it
  • 2015-06-29 20:53
  • 4901

Java程序员从笨鸟到菜鸟之(六十四)细谈Hibernate(十五)HQL与QBC查询方式详解

首先来看一下,hibernate提供的几种检索方式: 1.导航对象图检索方式 :根据已经加载的对象,导航到其他对象。例如,对于已经加载的Customer对象,调用它的getOrders().iterator()方法就可以导航到所有关联的Order对象,假如在关联级别使用了延迟加载检索策略...
  • csh624366188
  • csh624366188
  • 2012-05-31 13:42
  • 8978

Hibernate的HQL,QBC 查询语言(包括多表联合查询join)

引用链接:http://takeme.iteye.com/blog/1722522   参考链接: in和not in用法:http://blog.csdn.net/shiqidide/article/details/7327460   或  ...
  • xn_28
  • xn_28
  • 2017-04-24 03:26
  • 2670

Hibernate的QBE查询方式

使用QBE查询,我们可以将查询数据封装成对象,传递给Example进行查询,美中不足的是,QBE方式不能只能支持对象属性字段的等于查询,和字符串的模糊匹配,不能支持大于,等于的操作 package Search.QBE;import java.io.File;impor...
  • daryl715
  • daryl715
  • 2007-12-06 16:18
  • 2841

Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询

HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多。条件查询、分页查询、连接查询、嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了类或者对象。其它的,包括一些查询函数(count(),sum()等)、查询条件的设定等,全都跟...
  • Marry1234789
  • Marry1234789
  • 2016-10-17 22:28
  • 340

Hibernate —— HQL与QBC的区别

Hibernate主要有如下几种查询方式: 导航对象图检索方式 根据己经加载的对象,导航到其他对象。   OID检索方式 按照对象的OID来检索对象。   HQL检索方式 使用面向对象的HQL查询语言。 HQL(Hibernate QueryLanguage) 是面向对象的查询语...
  • u012045597
  • u012045597
  • 2013-11-12 21:50
  • 2121

hibernate高级查询技术之“HQL和QBC”的区别

作者是一名hibernate初学者,接触到HQL和QBC两种高级数据库查询方式,为了更深刻的理解两种方法的区别,本文收集了一个些概念和大牛们的见解。希望分享给大家。 首先, 附录 Hibernate:HQL/QBC查询语言用法(1):(转自:http...
  • langjian2012
  • langjian2012
  • 2014-09-07 19:42
  • 1476
    个人资料
    • 访问:256277次
    • 积分:3937
    • 等级:
    • 排名:第9560名
    • 原创:134篇
    • 转载:193篇
    • 译文:0篇
    • 评论:40条
    博客专栏