Hibernate总的来说共有三种查询方式:HQL、QBC和SQL三种。但是细分可以有如下几种:

一、HQL查询方式
    这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多。条件查询、分页查询、连接查询、嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了类或者对象。其它的,包括一些查询函数(count(),sum()等)、查询条件的设定等,全都跟SQL语法一样。
###注意:
     在hql中关键字不区分大小写,但是属性和类名区分大小写
示例1:

  static void query(String name){
  Session s=null;

try{

s=HibernateUtil.getSession();

//from后面是对象,不是表名

String hql="from Admin as admin where admin.aname=:name";//使用命名参数,推荐使用,易读。

Query query=s.createQuery(hql);

query.setString("name", name);

List<Admin> list=query.list();

for(Admin admin:list){

System.out.println(admin.getAname());
  }

}finally{

if(s!=null)

s.close();
 }
}
######!!!!!!!!!!!!!对于多对一关系查询:
 
String hql = "from Student where Class.className = '二班'";
(Student实体类中含有Class对象的引用。这样相当于两张表的联合查询)

示例2(分页查询):
    Query query = session.createQuery("from Customer c
order by c.name asc");
query.setFirstResult(0);
query.setMaxResults(10);
List result = query.list();
    说明:
  
 –setFirstResult(int firstResult):设定从哪一个对 象开始检索,参数firstResult表示这个对象在查询结果中的索引位置,索引位置的起始值为0。默认情况下,Query和Criteria接口从查 询结果中的第一个对象,也就是索引位置为0的对象开始检索。

–setMaxResult(int maxResults):设定一次最多检索出的对象数目。默认情况下,Query和Criteria接口检索出查询结果中所有的对象。

适用情况:常用方法,比较传统,类似jdbc。缺点:新的查询语言,适用面有限,仅适用于Hibernate框架。

二、QBC(Query By Criteria) 查询方式
   这种方式比较面向对象方式,重点是有三个描述条件的对象:Restrictions,Order,Projections。使用QBC查询,一般需要以下三个步骤:

1、 使用Session实例 的createCriteria()方法创建Criteria对象
   2、使用工具类Restrictions的方法为Criteria对象设置查询条件,Order工具类的方法设置排序方式,Projections工具类的方法进行统计和分组。
   3、 使用Criteria对象的list()方法进行查询并返回结果

Restrictions类的常用方法:

Restrictions类的常用方法:

方法名称
描述
Restrictions.eq 等于
Restrictions.allEq 使用Map,Key/Valu进行多个等于的比对
Restrictions.gt 大于
Restrictions.ge 大于等于
Restrictions.lt 小于
Restrictions.le 小于等于
Restrictions.between 对应SQL的between
Restrictions.like 对应SQL的like
Restrictions.in 对应SQL的in
Restrictions.and and关系
Restrictions.or or关系
Restrictions.sqlRestriction SQL限定查询

Order类的常用方法:

方法名称
描述
Order.asc 升序
Order.desc 降序

Projections类的常用方法

方法名称
描述
Projections.avg 求平均值
Projections.count 统计某属性的数量
Projections.countDistinct 统计某属性不同值的数量
Projections.groupProperty 指定某个属性为分组属性
Projections.max 求最大值
Projections.min 求最小值
Projections.projectionList 创建一个ProjectionList对象
Projections.rowCount 查询结果集中的记录条数
Projections.sum 求某属性的合计

示例:static void cri(String name,String password){

Session s=null;

try{

s=HibernateUtil.getSession();

Criteria c=s.createCriteria(Admin.class);

c.add(Restrictions.eq("aname",name));//eq是等于,gt是大于,lt是小于,or是或

c.add(Restrictions.eq("apassword", password));

List<Admin> list=c.list();

for(Admin admin:list){

System.out.println(admin.getAname());

}

}finally{

if(s!=null)

s.close();

}
}

示例2(分页查询):
    Criteria criteria = session.createCriteria(Customer.class);
criteria.addOrder( Order.asc("name") ); //排序方式
criteria.setFirstResult(0);
criteria.setMaxResults(10);
List result = criteria.list()
 
 适用情况:面向对象操作,革新了以前的数据库操作方式,易读。缺点:适用面较HQL有限。

三、QBE(Query By Example)例子查询方式
   将一个对象的非空属性作为查询条件进行查询。
 示例:Session session = SessionFactory.getCurrentSession();

User user = new User();
   user.setName("ijse");

Transaction ts = session.beginTransaction();

try {

Criteria criteria = session.createCriteria(User.class);

criteria.add(Example.create(user));

user= (User) criteria.list().get(0);  

session.commit();

} catch (HibernateException ex) {

ts.rollBack();

ex.printStackTrace();

}

System.out.println(user.getName());
适用情况:面向对象操作。   缺点:适用面较HQL有限,不推荐。

四、DetachedCriteria:离线条件查询
   离线查询就是建立一个DetachedCriteria对象,将查询的条件等指定好,然后在session.beginTransaction()后将这个对象传入。通常这个对象可以在表示层建立,然后传入业务层进行查询。
  1、建立DetachedCriteria对象
    DetachedCriteria dc = DetachedCriteria.forClass(User.class);

int id = 1;

if (id != 0)

dc.add(Restrictions.eq("id", id));

Date age = new Date();

if (age != null)

dc.add(Restrictions.le("birthday", age));

List users = dc(dc);//执行查询

System.out.println("离线查询返回结果:" + users);
 2、执行查询
   static List dc(DetachedCriteria dc) {
   Session s = HibernateUtil.getSession();

Criteria c = dc.getExecutableCriteria(s);
  List rs = c.list();

s.close();
  return rs;
}
适用情况:面向对象操作,分离业务与底层,不需要字段属性摄入到Dao实现层。 缺点:适用面较HQL有限。

五、命名查询
  1、在数据映射元文件中进行配置如下:
 <?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

<class name="com.sy.vo.User" table="user" catalog="news">
   ....
    </class>

<!-- 命名查询:定义查询条件 -->

<query name="getUserById">

<![CDATA[from User where id=:id]]>

</query>

<!-- 命名查询中使用sql,不推荐使用,影响跨数据库

<sql-query name="getUserById2">

<![CDATA[select * from User where ]]>

</sql-query> -->

</hibernate-mapping>
  2、在java代码中写入:
  static List namedQuery(int id) {
  Session s = HibernateUtil.getSession();
  Query q = s.getNamedQuery("getUserById");
  q.setInteger("id", id);

  return q.list();
 }
适用情况:万能方法,有点像ibatis轻量级框架的操作,方便维护。  缺点:不面向对象。基于hql和sql,有一定缺陷。

六、SQL查询
   示例:
static List sql() {
 Session s = HibernateUtil.getSession();

Query q = s.createSQLQuery("select * from user").addEntity(User.class);

List<User> rs = q.list();

s.close();

return rs;
 }
适用情况:不熟悉HQL的朋友,又不打算转数据库平台的朋友,万能方法   缺点:破坏跨平台,不易维护,不面向对象。

七、OID查询方式
   
 按照对象的OID来检索对象。Session的get()和load()方法提供了这种功能。如果在应用程序中事先知道了OID,就可以使用这种检索对象的方式。 

八、Query.iterator的N+1查询(基于一的HQL,多见于一对多、多对多的关联映射)
  N + 1问题,在默认情况下,使用query.iterate查询,有可以能出现N+1问题
   所谓的N+1是在查询的时候发出了N+1条sql语句
   1: 首先发出一条查询对象id列表的sql
   N: 根据id列表到缓存中查询,如果缓存中不存在与之匹配的数据,那么会根据id发出相应的sql语句
* list和iterate的区别?
   * list每次都会发出sql语句,list会向缓存中放入数据,而不利用缓存中的数据
   * iterate:在默认情况下iterate利用缓存数据,但如果缓存中不存在数据有可以能出现N+1问题

  示例:Query q=session.createQuery(“from UserInfo”);
     Iterator<UserInfo> list=q.iterate();

     While(list.hasNext()) {
     UserInfo st = (UserInfo) it.next();
     System.out.println(st.getName());
    }
避免N+1查询解决方法:
    1、可以将fetch抓取数据的属性改为“join”,来避免N+1次的查询;
    2、使用二级缓存

九、复查查询(基于二:QBC的深度查询)
  复合查询就是在原有查询的基础上再进行查询,可以调用Criteria对象的createCriteria()方法在这个Criteria对象的基础上再进行查询。
示例:Session session = SessionFactory.getCurrentSession();

User user = new User();

Transaction ts = session.beginTransaction();

try  {

Criteria criteria1 = session.createCriteria(Room.class);

Criteria  criteria2 =criterial.createCriteria("User");

criteria2.add(Restrictions.eq("name",new String("ijse"));

user= (User) criteria.list().get(0);

session.commit();

} catch (HibernateException ex) {

ts.rollBack();

ex.printStackTrace();
 }

System.out.println(user.getName());

Hibernate查询方式汇总的更多相关文章

  1. hibernate 查询方式汇总

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

  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 查询方式(HQL/QBC/QBE)汇总

    作为老牌的 ORM 框架,Hibernate 在推动数据库持久化层所做出的贡献有目共睹. 它所提供的数据查询方式也越来越丰富,从 SQL 到自创的 HQL,再到面向对象的标准化查询. 虽然查询方式有点 ...

  8. Hibernate的查询方式汇总

    分别是HQL查询,对象化查询Criteria方法,动态查询DetachedCriteria,例子查询,sql查询,命名查询. 如果单纯的使用hibernate查询数据库只需要懂其中的一项就可以完成想要 ...

  9. Redis查询&JDBC查询&Hibernate查询方式的效率比较...

    比较三种查询方式查询效率对比...我是用的JavaWeb的方式通过通过JSP页面查询的填写查询的参数...给予反馈.... 整个demo的下载地址:http://files.cnblogs.com/f ...

随机推荐

  1. 内存、缓存、cpu之间的关系

    一.缓存和内存 许多人认为,“缓存”是内存的一部分 许多技术文章都是这样教授的 但是还是有很多人不知道缓存在什么地方,缓存是做什么用的 其实,缓存是CPU的一部分,它存在于CPU中 CPU存取数据的速 ...

  2. Win10 VC++运行库集合|VC++ 2005 2008 2010 2012 2015

    在Win10系统中很多朋友在运行一些软件时会遇到缺少.DLL的情况,主要是没有安装VC++运行库下面小编收集了Win10 VC++运行库集合,大家安装上去就可以了~ 微软常用软件运行库合集(vc201 ...

  3. node代理网络请求

    server.js var express = require('express') var axios = require('axios') var port = 9000; var app = e ...

  4. CodeForces660B【模拟—水】

    感觉模拟题用函数分块写比较清晰~传参的话,字符串要么直接全局,或者指针也是容易操作,总之思路清晰,然后分块清晰,模拟wa的少吧. 这题水题,不说了. #include <bits/stdc++. ...

  5. Unity3D教程:无缝地形场景切换的解决方法

    http://www.unitymanual.com/6718.html 当我们开发一个大型项目的时候-会遇到这样的问题(地形场景的切换)这个只是字面意思-并不是重场景1的100  100 100坐标 ...

  6. Unity(2) 脚本简单操作

    生命周期(按顺序排列) Awake():脚本唤醒,系统执行的第一个方法,在脚本声明周期内只执行一次,初始化一般可以在这里 Start():Awake之后,Update之前,只执行一次,一般在awake ...

  7. valgrind 使用入门

    近期在学习使用valgrind 来定位性能问题,记录一下整个操作过程以及涉及到的工具 一般在机器上都会预装valgrind 工具 使用callgrind 工具检查程序的调用情况,例如使用valgrin ...

  8. java数据结构----队列,优先级队列

    1.队列:和栈中的情况不同,队列中的数据项不总是从数组下标0开始,移除一个数据项后,队头指针会指向下标较高的数据项,其特点:先入先出 2.图解 3.队列的实现代码: 3.1.Queue.java pa ...

  9. 洛谷 P1086 花生采摘

    P1086 花生采摘 将植株按花生数从大到小排序,然后按排序后的顺序摘,每次摘前计算能否在摘后回到路边,如果能就将ans加上该植株花生数,如果不能就直接输出当前ans并退出. var a:array[ ...

  10. 安卓Listview 不规则项即不同item的运行

    在安卓中,listview  的item 是一个不断被轮询调换位置的过程,这样 即 图片参考地址   http://www.cnblogs.com/mybkn/archive/2012/05/23/2 ...