一、Hibernate提供的查询方式

  • OID查询方式:主键查询。通过get()或者load()方法加载指定OID的对象查询结果为一个
  • HQL查询方式:通过Query接口使用HQL语言进行查询
  • QBC查询方式:通过Criteria等接口和类进行是查询
  • 本地SQL查询方式:使用原生的SQL语言进行查询
  • 对象导航查询方式:通过已经加载的对象,导航到其关联对象

其中HQL和QBC是Hibernater提供的专业的查询方式

HQL查询方式为官方推荐的标准查询方式

二、HQL查询简述

HQL:Hibernate Query Language

这种语言看上去很像SQL。但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态 和关联之类的概念。

例如:

                //1.得到session
Session session=HibernateSessionFactory.getSession();
//2。创建查询语句这里的Student为持久化类的,类名
String hql="from Student";
//String hql="from Student where sname='张三'";
//3.创建Query对象
Query query=session.createQuery(hql);
//4.执行查询 返回结果为list集合
List<Student> list=query.list();
//5.输出结果
for (Student stu : list) {
System.out.println(stu.getSname()+stu.getSex());
}

三、最简单的查询

查询全部信息

from Student    //直接使用持久化类名
from com.pb.entity.Student //使用全路径

通常我们不需要使用类的全限定名, 因为 auto-import(自动引入) 是缺省的情况。

也可以为类名指定别名

from Student as s     //使用as 关键字指定类的别名
from Student s //省略as 关键字指定类的别名

四、where子句

也可以支持where子句

from Student where sid=201503011
from Student s where s.sid=201503011

4.1、在where中可以使用各种运算符

例如:

from Student where sex='男' and sid<11070200
//查询学生性别 为男同时,学号小于 11070200的学生 from Student where sid between 11070100 and 11070200
//查询学生学号在11070100 and 11070200之间的学生 from Student where snamelike '%飞';
//查询学生姓名最后一个字为飞的全部学生 from Student where sname like '_ik*';
//查询学生姓名,第一个字为任意,第2个为i,第3个为k,后面任意长度的学生

其中"-"匹配单个字符

"%"匹配任意长度的字符

"_"不可以进行汉字匹配,"%"可以进行汉字匹配

五、返回结果

Query的方法

5.1、list()方法

//1.得到session
Session session=HibernateSessionFactory.getSession();
//2。创建查询语句这里的Student为持久化类的,类名
String hql="from Student";
//String hql="from Student where sid=201503011 ";
//3.创建Query对象
Query query=session.createQuery(hql);
//4.执行查询 返回结果为list集合
List<Student> list=query.list();
//5.输出结果
for (Student stu : list) {
System.out.println(stu.getSname()+stu.getSex());
}

5.2、iterate()方法

//1.得到session
Session session=HibernateSessionFactory.getSession();
//2。创建查询语句这里的Student为持久化类的,类名
String hql="from Student";
//String hql="from Student where sid=201503011 ";
//3.创建Query对象
Query query=session.createQuery(hql);
//4.执行查询 返回结果为Iterator
Iterator<Student> iterator=query.iterate();
//5.输出结果
while(iterator.hasNext()){
Student stu=iterator.next();
System.out.println(stu.getSname()+stu.getSex());
}

5.3、uniqueResult()方法

返回的结果为一个对象,一般用来根据主键查询

//1.得到session
Session session=HibernateSessionFactory.getSession();
//2。创建查询语句这里的Student为持久化类的,类名
//String hql="from Student";
String hql="from Student where sid=201503011 ";
//3.创建Query对象
Query query=session.createQuery(hql);
//4.执行查询 返回结果为Object类型,
Student student=(Student) query.uniqueResult();
//5.输出结果
System.out.println(student.getSname()+student.getSex());

5.4、list()和iterate()方法区别

两都的查询机制不同

使用list()时,只需要查询一次就可以完成全部持久化类的,全部字段的查询

使用iterate()时,第一次查询出来的是全部记录的主键ID,然后再去系统缓存中查询相应的记录,如果有这个ID的记录, 将不进行数据库查询,如果没有将进行数据库查询,有多少条记录就要查询1+N次。

六、属性查询(投影查询)

6.1、直接指定属性查询

返回结果为Object数组,数组的长度为属性的个数

public static void findByproperty(){
//1.得到session
Session session=HibernateSessionFactory.getSession();
//2。创建查询语句这里的Student为持久化类的,类名
//String hql="from Student";
String hql="select sid,sname,sex from Student ";
//3.创建Query对象
Query query=session.createQuery(hql);
//4.执行查询 返回结果为Object类型,
List list=query.list();
//5.输出结果
for (Object object : list) {
//结果为查询属性数据 的Object对象数组
Object [] obj=(Object[]) object;
System.out.println(obj[0]+"\t"+obj[1]+"\t"+obj[2]);
} }

6.2、使用构造方法查询

前提是持久化类中要有这个构造方法

返回结果为持久化类的对象集合

public static void findByCons(){
//1.得到session
Session session=HibernateSessionFactory.getSession();
//2。创建查询语句这里的Student为持久化类的,类名
//String hql="from Student";
String hql="select new Student(sid,sname,sex) from Student ";
//3.创建Query对象
Query query=session.createQuery(hql);
//4.执行查询 返回结果为Object类型,
List<Student> list=query.list();
//5.输出结果
for (Student stu : list) {
System.out.println(stu.getSname()+"\t"+stu.getSex());
} }

这种更直接,明了解,一定要有相应的构造方法

七、实体更新和删除

7.1、更新

    Session session =new Configuration().configure().buildSessionFactory().openSession();
Student stu=(Student) session.get(Student.class, 201509009); Course cou=(Course) session.get(Course.class, 2222); Transaction tran=session.beginTransaction();
stu.getCourses().add(cou);
session.update(stu);
tran.commit();
session.close();

7.2、删除

Session session =new Configuration().configure().buildSessionFactory().openSession();
Student stu=(Student) session.get(Student.class, 201509009); Course cou=(Course) session.get(Course.class, 2222); Transaction tran=session.beginTransaction();
stu.getCourses().remove(cou);
session.update(stu);
tran.commit();
session.close();

八、参数绑定

8.1占位符、

和JDBC中一样使用?来占位

8.2、命名参数

九、排序

十、统计函数

    public static void findCount(){
Session session=new Configuration().configure().buildSessionFactory().openSession();
/*String hql="from Emp";
Query query=session.createQuery(hql);
List list=query.list();
int count=list.size();*/
String hql="select count(*) from Emp";
Query query=session.createQuery(hql);
Long count=(Long) query.uniqueResult();
System.out.println("员工表总记录数:"+count); }

Hibernate(九)HQL查询的更多相关文章

  1. hibernate的hql查询

    1.概念介绍 1.Query是Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的过程,Query包装了一个HQL查询语句. 2.HQL是Hibernate Query Langua ...

  2. Hibernate之HQL查询

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

  3. Hibernate五 HQL查询

    HQL查询一 介绍1.HQL:Hibernate Query Language,是一种完全面向对象的查询语言.使用Hibernate有多重查询方式可供选择:hibernate的HQL查询,也可以使用条 ...

  4. Hibernate 的hql查询简介【申明:来源于网络】

    Hibernate 的hql查询简介[申明:来源于网络] Hibernate 的hql查询简介:http://blog.csdn.net/leaf_130/article/details/539329 ...

  5. hibernate的hql查询语句总结

    这篇随笔将会记录hql的常用的查询语句,为日后查看提供便利. 在这里通过定义了三个类,Special.Classroom.Student来做测试,Special与Classroom是一对多,Class ...

  6. Hibernate 笔记 HQL查询 条件查询,聚集函数,子查询,导航查询

    在hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题? 解决方案一,按照Object[]数据取出数据,然后自己组bean 解决方 ...

  7. Hibernate 、Hql查询和Criteria查询

    HQL查询: public Object query(String name){ Session s=null; try{ s=HibernateSessionFactory.getSession() ...

  8. Hibernate之HQL查询的一些例子

    Hibernate配备了一种非常强大的查询语言,就是HQL(hibernate query language),HQL看上去很像sql,但只是语法结构上相似,HQL是一种面向对象的查询,他可以理解继承 ...

  9. Hibernate 中Hql 查询中间表的用法

    案例简述: 项目中存在User 用户表 和 Role 角色表 它们之间是多对多的关系 在User类定义中 使用hibernate注解 //角色列表 @ManyToMany(targetEntity = ...

随机推荐

  1. linux—文件目录简单介绍

    1.Linux系统以文件目录的方式来组织和管理系统中的所有文件.所谓文件目录就是将所有文件的说明信息采用树型结构组织起来,即我们常说的目录:整个文件系统有一个“根”(root),然后在根上分“杈”(d ...

  2. Qt 编译boost

    Qt为4.6.2.Boost为1.63.0. 1.安装qt-sdk-win-opensource-2010.02.1.exe. 2.下载boost_1_63_0并解压,如:解压到E盘根目录下. 3.在 ...

  3. mongoDB系列之(三):mongoDB 分片

    1. monogDB的分片(Sharding) 分片是mongoDB针对TB级别以上的数据量,采用的一种数据存储方式. mongoDB采用将集合进行拆分,然后将拆分的数据均摊到几个mongoDB实例上 ...

  4. java并发基础(二)

    <java并发编程实战>终于读完4-7章了,感触很深,但是有些东西还没有吃透,先把已经理解的整理一下.java并发基础(一)是对前3章的总结.这里总结一下第4.5章的东西. 一.java监 ...

  5. 邮件基本常识普及(to/cc/bcc)

    http://blog.sina.com.cn/s/blog_5572b4b5010009ul.html 前两天,某个同事发的一封邮件着实把我给郁闷了,他发的是图片形式的笑话,内容稍稍有点不太健康,这 ...

  6. perf 工具介绍1

    https://perf.wiki.kernel.org/index.php/Tutorial http://os.51cto.com/art/201105/265133.htm 在LINUX 源代码 ...

  7. erlang资料

    http://www.cnblogs.com/--00/tag/Erlang/ http://blog.csdn.net/turingbooks/article/details/3247749 htt ...

  8. 埃及分解:将2/n分解成为1/x+1/y的格式

    算法 古埃及以前创造出灿烂的人类文明,他们的分数表示却非常令人不解.古埃及喜欢把一个分数分解为类似: 1/a + 1/b 的格式. 这里,a 和 b 必须是不同的两个整数,分子必须为 1 比方,2/1 ...

  9. ob_start()、ob_end_flush和ob_end_clean()多级缓冲

    ob_start() 和 ob_end_flush() 是一对很好的搭档,可以实现对输出的控制.当成一对出现理解起来就没什么问题,但是当他们两个各自出现次数增加时,就比较难理解了. <?php ...

  10. 解决TextView排版混乱或者自动换行的问题

    其实在TextView中遇到排版自动换行而导致混乱不堪的情况是非常常见的,而且导致这种问题产生的原因就是英文和中文混合输入,半角字符和全角字符混合在一起了.一般情况下,我们输入的数字.字母以及英文标点 ...