五、对象在Hibernate中的状态
对象在Hibernate中的状态图:
对象3种状态: Transient(瞬时/临时) Persistent(持久) Detached(脱管/游离)
瞬时状态(Transient):
在内存中刚刚创建的对象,还没有同步到数据库,如果没有变量对它进行引用,它将被JVM回收。或者是数据库中信息被删除了的对象也是临时状态。
特点-- 不和Session实例关联;
在数据库中没有和瞬时对象关联的记录。
持久化状态(Persistent):
持久的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。持久的事例可能是刚被保存的,或刚被加载的,无论哪一种,按定义对象都仅在相关联的Session生命周期内保持这种状态。而且持久对象也与Transaction相关联,必须在Transaction终止,也就是执行commit()之后,持久对象的状态才会与数据库进行同步。
特点-- 和Session实例关联;
在数据库中有和持久对象关联的记录。
游离状态(Detached):
与持久对象关联的Session被关闭后,对象就变为游离的。对游离对象的引用依然有效,对象可以被继续修改。游离对象如果重新关联到某个新的Session上,会再次转变为持久的(注:这样游离状态期间的改动会持久化到数据库中)。
特点-- 本质上和瞬时对象相同
只是比瞬时对象多了一个数据库记录标识值id
六、HQL(Hibernate Query Language)
HQL是面向对象的查询语言,它的语法和SQL有些相似,在运行时才得以解析。
注意:HQL是面向对象的,不要在语句中有表的概念存在。
1.最简单的查询:
查询所有的Student对象: from Student 或 select s from Student s
除了Java类与属性名称外,查询语句大小写不敏感。
2.属性查询:
有时不希望得到对象所有属性,则:
Query query = session.createQuery(“select s.name from Student s”);
List list = query.list();
for(int i=0; i<list.size(); i++)
{
String name = (String)list.get(i);
System.out.println(name);
}
若 “select s.name, s.age from Student as s” 则查询结果会以数组形式返回。
Object obj[] = (Object[]) list.get(i);
3.实例化查询
是对属性查询的一种改进。将Object[]中的所有成员封装成一个对象:
Query query = session.createQuery(“select new Student(s.name, s.age) from Student s”)
List list = query.list();
for(int i=0; i<list.size(); i++)
{
Student stu = (Student)list.get(i); //此Student实例并未与数据库有任何关系
System.out.println(stu.getName());
}
4.连接查询
- inner join (内连接)
left outer join (左外连接)
right outer join (右外连接)
full join (全连接,不常用)
5.统计函数查询
常用: count() 、 min() 、 max() 、 sum() 、 avg()
Query query = session.createQuery(“select count(*) from Student”); //取得Student数量
Query query = session createQuery(“select avg(s.age) from Student as s”);
//取得Student平均年龄
Query query = session createQuery(“select upper(s.name) from Student as s”); //转大写
Query query = session createQuery(“select distinct s.age from Student as s”); //去除重复数据
6.子查询
如果子查询返回多条记录,可以用以下关键字来量化:
all: 表示所有的记录
any: 表示所有记录中的任意一条
some 与any用法一样
in 等价于”=any”
exists 表示子查询至少要返回一条记录
查询大于等于20个学生的班级:
Query query = session.createQuery(“from Team t where(select count(*) from t.students)>=20”);
查询所有学生年龄不小于21岁的班级对象
From Team t where 21<all (select s.age from t.students s)
注意:MySQL从4.1x版本才支持子查询,以前的版本中可用连接查询和分组查询取代。
如果给你带来帮助,欢迎微信或支付宝扫一扫,赞一下。

