作为老牌的 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. 密码学应用(DES,AES, MD5, SHA1, RSA, Salt, Pkcs8)

    目录 一.数据加密标准 - Data Encryption Standard(DES) 二.高级加密标准 - Advanced Encryption Standard(AES) 三.消息摘要算法第五版 ...

  2. 分享一实战性开源MVC框架<Linux、Windows跨平台开发so easy>

    一.引子   开源地址 https://github.com/564064202/Moon.Mvc 欢迎加入开发 .NET Core微软还在发力,但作为商用还有一段距离,很多开发库尚不能用于.NET ...

  3. Oracle 中的sql函数以及分页

    SELECT LPAD(,'*.') "LPAD example" FROM DUAL; 1.分页查询 (1)方法一:使用  between  and 来实现分页 select * ...

  4. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  5. Nancy之大杂烩

    Nancy关于Hosting的简单介绍 一. Nancy之基于Nancy.Hosting.Aspnet的小Demo 二.Nancy之基于Nancy.Hosting.Self的小Demo 三.Nancy ...

  6. ASP.NET MVC 利用IRouteHandler, IHttpHandler实现图片防盗链

    你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你的服务器带宽.下面这种方法可以告诉你如何在ASP.NET MVC中实现一个自定义Ro ...

  7. Ionic2系列-将beta升级到RC1

    国庆节前Ionic2发布了RC0版本,已经接近正式版了,前不久Angular2和TypeScript2也已经发布了正式版.详情请参考官方博客: http://blog.ionic.io/announc ...

  8. ASP.NET的视图(Razor)循环产生html代码

    需要要视图中Razor语法,循环产生一些html代码. 产生后的html是这样的: <li data-transition="> <img src="~/Cont ...

  9. Springl利用Aspectj的扩展实现Aop

    1. Spring为什么要使用Aspectj Spring Aop:Spring自己原生的Aop,只能用一个词来形容:难用. 你需要实现大量的接口,继承大量的类,所以spring aop一度被千夫所指 ...

  10. GOF23设计模式之工厂模式

    -实现了创建者和调用者的分离 -面向对象设计的基本原则: ·OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭 ·DIP(依赖倒转原则,Depen ...