作为老牌的 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 查询方式。

Hibernate 查询方式(HQL/QBC/QBE)汇总的更多相关文章

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

    HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了 ...

  2. hibernate查询方式

    hibernate查询方式:1.本地SQL查询 2.HQL查询 3.QBC查询 HQL查询:是面向对象的查询语言,是使用最广的一种查询方法 QBC查询:Query by Criteria是一套接口来实 ...

  3. (十)Hibernate 查询方式

     所有项目导入对应的hibernate的jar包.mysql的jar包和添加每次都需要用到的HibernateUtil.java 第一节:Hibernate 查询方式简介 1,导航对象图查询方式: 2 ...

  4. Hibernate查询方式(补)

    -----------------siwuxie095                             Hibernate 查询方式         1.对象导航查询     根据已经加载的对 ...

  5. Hibernate学习10——Hibernate 查询方式

    本章主要是以查询Student的例子: Student.java: package com.cy.model; public class Student { private int id; priva ...

  6. Hibernate 查询方式、JPA查询方式

    hibernate 查询方式: OID 查询 对象导航查询 HQL 方式查询 QBC方式查询 原生SQL方式查询 JPA 查询方式: OID 查询 对象导航查询 JPQL 方式查询 CriteriaB ...

  7. hibernate 查询方式汇总

    主要摘自  http://blog.sina.com.cn/s/blog_7ffb8dd501014a6o.html ,http://blog.csdn.net/xingtianyiyun/artic ...

  8. Hibernate查询方式汇总

    Hibernate总的来说共有三种查询方式:HQL.QBC和SQL三种.但是细分可以有如下几种: 一.HQL查询方式    这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的 ...

  9. Hibernate -- 检索方式 HQL

    Hibernate 提供了以下几种检索对象的方式 导航对象图检索方式:  根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的OID 来检索对象 HQL 检索方式:使用面向对象的HQL查询 ...

随机推荐

  1. css或者js文件后面跟着参数

    以前一直不懂,看到某某网站上面css链接 ?v=20130203类似这样的 后来发现是为了避免浏览器读取缓存而采取的强制刷新缓存的办法. “比如新浪首页在2010年4月5日改版,只是改变CSS样式表, ...

  2. ubuntu Chromium 安装 pepperflashplugin

    sudo apt-get update sudo apt-get install chromium-browser sudo apt-get install pepperflashplugin-non ...

  3. 【转载】C#怎么判断字符是不是汉字

    支持并尊重原创!原文地址:http://jingyan.baidu.com/article/2c8c281deb79ed0008252af1.html 判断一个字符是不是汉字通常有三种方法,第1种用 ...

  4. Linq to sql 有什么办法可以实现消除列重复?

    比如数据库里有一表,有两个字段:ID User1 小白2 小红3 小白 过滤User列为小白的重复项后,我想要得到:ID User1 小白2 小红 如果写db.linq.customer.Distin ...

  5. Centos下搭建 tomcat https服务器详解(原创)

    一 .安装java jdk配置环境变量 1. 卸载原有openjdk yum -y remove java-1.7.0-openjdk* yum -y remove tzdata-java.noarc ...

  6. 使用 SSH上传安装tomcat

    开发步骤: 1.在soft文件夹下上传tomcat 2.[root@localhost soft]# tar  -zxvf apache-tomcat-7.0.61.tar.gz    //解压安装 ...

  7. linux下操作问题与总结

    一. 出现问题 :从服务器244里拷贝ajun文件到自己linux下, 出现ajun: not a regular file?      解决方案:在进行scp传输“文件夹”的时候,加上参数r. 二. ...

  8. Lind.DDD.SSO单点登陆组件的使用(原创)

    回到目录 一般sso的说明 在Lind.DDD框架里,有对单点登陆的集成,原理就是各个网站去sso网站统一登陆授权,之后在sso网站将登陆的token进行存储,存储方式随你(cache,redis,m ...

  9. android Activity介绍

    一般情况下,Android程序的流程都运行在activity中,activity具有自己的生命周期,由系统来控制.可以使用onSaveInstanceState()和onRestoreInstance ...

  10. 获取View的截图-将View转换为Bitmap对象

    开发中,有时候需要获取View的截图来做动画来达到动画流程的目的 原理:将View的内容画到一个Bitmap画布上,然后取出 下面封装了一个从View生成Bitmap的工具类 /** * 将View转 ...