作为老牌的 ORM 框架,Hibernate 在推动数据库持久化层所做出的贡献有目共睹。

它所提供的数据查询方式也越来越丰富,从 SQL 到自创的 HQL,再到面向对象的标准化查询。

虽然查询方式有点眼花缭乱,配置使用起来也稍微有点复杂。

但是丝毫掩盖不了它迷人的地方,本篇博客试着汇总 Hibernate 所有的查询方式。

萝卜青菜各有所爱,工作中可以根据自己的喜好选择其中的几种进行编程。

1. HQL 方式,参数使用问号占位(4.1 版本中已被废弃)

  1. public List<UserPO> getUserList(UserPO userPO) {
  2. String hql = "from UserPO where name = ? and passwd= ?";
  3. Query query = getHibernateSession().createQuery(hql);
  4. query.setParameter(0, userPO.getName());
  5. query.setParameter(1, userPO.getPasswd());
  6. return query.list();
  7. }

2. HQL 方式,参数使用命名占位

  1. public List<UserPO> getUserList(UserPO userPO) {
  2. String hql = "from UserPO where name = :userName and passwd= :userPwd";
  3. Query query = getHibernateSession().createQuery(hql);
  4. query.setParameter("userName", userPO.getName());
  5. query.setParameter("userPwd", userPO.getPasswd());
  6. return query.list();
  7. }

3. HQL 方式,参数使用 JPA 占位符

  1. public List<UserPO> getUserList(UserPO userPO) {
  2. String hql = "from UserPO where name = ?1 and passwd= ?2";
  3. Query query = getHibernateSession().createQuery(hql);
  4. query.setParameter("1", userPO.getName());
  5. query.setParameter("2", userPO.getPasswd());
  6. return query.list();
  7. }

4. HQL 方式,参数使用对象绑定

  1. public List<UserPO> getUserList(UserPO userPO) {
  2. String hql = "from UserPO where name = :name and passwd= :passwd";
  3. Query query = getHibernateSession().createQuery(hql);
  4. query.setProperties(userPO);
  5. return query.list();
  6. }

PS:需要注意的是命名参数占位要与PO属性一致,而且只能使用参数命名占位的方式。

当然上述的 1--4 填充查询方式,HQL 都可以调整为 SQL 是相通的(使用 createSQLQuery)。

5. QBC(Query By Criteria) 方式,参数使用 Restrictions 对象

  1. public List<UserPO> getUserList(UserPO userPO) {
  2. Criteria criteria = getHibernateSession().createCriteria(UserPO.class);
  3. criteria.add(Restrictions.eq("name",userPO.getName()));
  4. criteria.add(Restrictions.eq("passwd",userPO.getPasswd()));
  5. return criteria.list();
  6. }

6. QBC(Query By Criteria) 方式,参数使用对象绑定

  1. public List<UserPO> getUserList(UserPO userPO) {
  2. Criteria criteria = getHibernateSession().createCriteria(UserPO.class);
  3. criteria.add(Example.create(userPO));
  4. return criteria.list();
  5. }

PS: QBC(Query By Criteria) 方式,使用到的关键抽象对象有:

Restrictions --> 设置查询限制条件

Order --> 设置查询排序条件

Projections --> 工具类的方法进行统计和分组。

上述 5-6 也是我最喜欢的方式,用面向对象查询方式来迎合面向对象的编程。

当查询条件中都是等于的时候,使用方法6,代码是相当简洁优雅的。

如果查询条件中含有其他判断限制,如>、<、like、between 时,使用方式 5 也是不错的选择。

但出现特殊情况,如属性字段为时间类型,因各数据库对时间字段的的规范和类型不同。

填充 PO 时间类型属性后,无法精准的使用方式 5/6 进行时间查询的判断限制,这时需要从 1-4 方式中变通一下。

7. 离线条件查询

  1. public List<UserPO> getUserList(UserPO userPO) {
  2. DetachedCriteria detachedCriteria = DetachedCriteria.forClass(UserPO.class);
  3. detachedCriteria.add(Restrictions.eq("name",userPO.getName()));
  4. detachedCriteria.add(Restrictions.eq("passwd",userPO.getPasswd()));
  5. Criteria criteria = detachedCriteria.getExecutableCriteria(getHibernateSession());
  6. return criteria.list();
  7. }

离线查询的好处,可以将查询对象 DetachedCriteria 作为参数传递到 DAO层,减少 DAO 层代码

8. QBC(Query By Criteria) 方式,分页查询

  1. public List<UserPO> getUserList(UserPO userPO) {
  2. Criteria criteria = getSession().createCriteria(UserPO.class);
  3. criteria.setFirstResult(4);
  4. criteria.setMaxResults(3);
  5. return criteria.list();
  6. }
  7. }

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. Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

    安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...

  2. Redis初识

    安装与使用 Redis-x64-3.2.100:服务端 + 客户端 redis-3.2.5:源代码 Redis Desktop Manager - v0.8.8:客户端(基于Qt5的跨平台Redis桌 ...

  3. 【Effective Java】9、使用EnumMap代替序数索引

    package cn.xf.cp.ch02.item33; import java.util.EnumMap; import java.util.HashSet; import java.util.M ...

  4. Redis 简单搭建

    ======== redis ======== 1. redis setup and test : 1. download the package from https://redis.io/down ...

  5. SQLServer修改表字段名称

    EXEC sp_rename 'TableName.[ColumnName]','ColumnNew','COLUMN'

  6. UITableViewCell定制

    UITableViewCell定制 效果       特点 1.可以添加不同的TableViewCell,可以定制不同的cell样式; 2.可以动态改变cell的高度; 3.可以随意摆放你cell的位 ...

  7. Android界面架构(Activity,PhoneWiondow,DecorView)简介

    在一个Android应用程序中,用户界面通过View和ViewGroup对象构建.所有View的子类成为"Widget",所有ViewGroup的子类成为"Layout& ...

  8. MBProgressHUD 显示后,为何不能点击屏幕其他地方

    解决办法: hud.userInteractionEnabled= NO;  就是这么简单粗暴!这个问题 我一定要发到首页候选区! /********************************* ...

  9. 记录我的点点滴滴从此刻做起——iOS开发工程师

    作为一个iOS工程师,想写博客也是有原因的:首先有这个想法(写博客的想法)也是因为想到自己都从事iOS开发快两年了,怎么也只会堆代码,写view,技术真的很一般,感觉都要被淘汰了:基于以上原因,自己也 ...

  10. Laravel大型项目系列教程(四)显示文章列表和用户修改文章

    小编心语:不知不觉已经第四部分了,非常感谢很多人给小编提的意见,改了很多bug,希望以后能继续帮小编找找茬~小编也不希望误导大家~这一节,主要讲的 是如何显示文章列表和让用户修改文章,小编预告一下(一 ...