Hibernate读书笔记-----Hibernate知识总结(三)

2014-11-24 08:46:57 · 作者: · 浏览: 4
时,整个继承树的所有实例都保存在同一张表中。这样做的好处就是不管进行怎样的查询,不管查询继承树中的那一层实体,底层数据库都只需在一张表中查询,无需进行多表查询,但是底层数据表结构不是很清楚。在这种映射策略下,需要增加一个辨别者列:discriminator元素来区分每行记录到底是那个类的实体。

joined-subclass:采用这种映射策略时,父类实例保存在父类表里,而子类实例则由父类表和子类表共同存储。也就是说父类表保存两者共有的属性,子类表保存子类独有的属性。
在这种映射策略下,需要为每个子类使用元素映射共有主键---该主键还将参照父类表的主键。使用该继承映射进行查询子类实例时,需要跨表查询,其中的深度要取决于该子类有多少层父类。

union-subclass:采用这种映射策略,父类实例的数据保存在父类表中,子类实例和父类实例的数据共同保存在子类表中。其中子类实例的数据在父类表中没有任何记录。对于这种继承策略,底层数据库的表结构更加符合正常情况下的数据库设计。注意:在采用这种继承映射策略时,映射持久化类时不要使用identity主键生成策略。


十、Hibernate的查询体系
Hibernate提供了强大的查询体系,可以使用如下三种方式使用Hibernate查询:HQL查询、条件查询、SQL查询。
1、HQL查询
HQL查询是完全面向对象的查询语言。它依赖于Query对象,每一个Query实例对应一个查询对象。使用HQL查询按如下步骤进行:
1、获取Hibernate Session对象。
2、编写HQL语句。
3、以HQL语句为参数,调用Session的createQuery方法创建Query查询对象。
4、如果HQL语句包含参数,则调用Query的setXxx方法为参数赋值。
5、调用Query对象的list等方法返回查询结果集。

[html]
private void query(){
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//以HQL语句创建Query对象,执行setString方法为HQL语句的参数赋值
//Query调用list方法访问查询的全部实例
List list = session.createQuery("select distinct p from Person p where p.name=:name")
.setString("name", "chenssy").list();

//遍历查询结果
for (Iterator iterator = list.iterator();iterator.hasNext();) {
Person p = (Person) iterator.next();
System.out.println("id="+p.getId()+",age="+p.getAge());
}
session.close();


2、条件查询
条件查询时更具面向对象特色的数据查询方式。条件查询通过如下三个类完成:
Criteria:代表一次查询。
Criterion:代表一个查询条件。
Restrictions:代表查询条件的工具类。
执行条件查询步骤如下:
1、获得Hibernate Session对象。
2、以Session对象创建Criteria对象。
3、使用Restrictions的静态方法创建Criterion查询条件。
4、向Criteria查询中添加Criterion查询条件。
5、执行Criteria的list()或者uniqueResult()方法返回结果集。
[java]
public void query(){
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//使用ctiteria进行条件查询
List list = session.createCriteria(Person.class)
.add(Restrictions.eq("id", 1))
.list();
for (Iterator iterator = list.iterator();iterator.hasNext();) {
Person person = (Person) iterator.next();
System.out.println(person.getName());
}
}

3、SQL查询 www.2cto.com
SQL查询时通过SQLQuery接口来表示的。SQLQuery接口是Query接口的子接口。
执行SQL查询的步骤如下:
1、获取Hibernate Session对象。
2、编写SQL语句。
3、以SQL语句作为参数,调用Session的createSQLQuery方法创建查询对象。
4、调用SQLQuery对象的addScalar()或者addEntity()方法将选出的结果与标量值或者实体进行关联,分别用于进行标量查询或者实体查询。
5、如果SQL语句包含参数,调用Query的setXxx方法为参数赋值。
6、调用Query的list方法返回查询的结果集。
标量查询:
[html]
session.createSQLQuery("select * from person_inf")

.addScalar("name",StandardBasicTypes.STRING)

.addScalar("age",StandardBasicTypes.INT)

.list();

实体查询:
[html]
session.createSQLQuery("select * from perons_inf").addEntity(Person.class).list;

session.createSQLQuery("select id,name,age from person_inf").addEntity(Person.class).list();


十一、Hibernate的数据过滤
数据过滤就是对数据进行筛选。一旦启用了数据过滤器,则不管是数据查询,还是数据加载,该过滤器将自动作用与所有数据。
数据过滤器分三步