Hibernate串讲笔记三

五、对象在Hibernate中的状态

对象在Hibernate中的状态图:

对象3种状态:  Transient(瞬时/临时)   Persistent(持久)  Detached(脱管/游离)

201067-23818343

瞬时状态(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 (全连接,不常用)

201067-23930250

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版本才支持子查询,以前的版本中可用连接查询和分组查询取代。


如果给你带来帮助,欢迎微信或支付宝扫一扫,赞一下。