作为老牌的 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. 你真的会玩SQL吗?实用函数方法汇总

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  2. Java程序猿 :2016 年终小结

    01 2016年即将进入尾声,不禁感叹,在学校的时候过日子是以天来算,而现在是以星期来算,甚至是月份. 这才发现,时间过得真快.这一年,遇到了很多人,很多事. 机缘巧合,年中去了趟帝都,爬了长城,游了 ...

  3. Java正则速成秘籍(三)之见招拆招篇

    导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...

  4. 一步一步开发Game服务器(五)地图寻路

    目前大多数使用的寻路算法有哪些? 目前市面上大部分游戏的寻路算法是A*,或者B*. A*通常所说的是最优算法也就是寻找最短路径.B*碰撞式算法也就是,也就是不断的去碰撞能走就走,不管是不是绕路.当然以 ...

  5. C# webform上传图片并生成缩略图

    其实里面写的很乱,包括修改文件名什么的都没有仔细去写,主要是想记录下缩略图生成的几种方式 ,大家明白就好! void UpImgs() { if (FileUpload1.HasFile) { str ...

  6. 网站美化常见CSS

    伴随网络时代日新月异的发展,用户不仅仅满足于软件系统的功能需求,对软件系统的页面显示效果以及交互模式的要求也逐渐提高.尤其是展示性质的平台页面对于界面美化效果要求更高,有一句话说的好:Html是结构, ...

  7. android

    配置Activity 的启动模式: 在 AndroidManifest.xml 中配置: <activity android:name=".MainActivity" and ...

  8. 《连载 | 物联网框架ServerSuperIO教程》- 11.实现设备(驱动)与设备(驱动)交互和级联控制。注:设备驱动模拟金三与普京的对话

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  9. Windows Form调用R进行绘图并显示

    R软件功能非常强大,可以很好的进行各类统计,并能输出图形.下面介绍一种R语言和C#进行通信的方法,并将R绘图结果显示到WinForm UI界面上. 1 前提准备 安装R软件,需要安装32位的R软件,6 ...

  10. CentOS7中安装Python3.5

    1.下载 https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz 2.上传到服务器 3. 安装相关依赖 yum install gcc ope ...