您的位置:首页 > 其它

Hibernate中检索方式返回值的一些心得

2010-09-05 11:21 471 查看
最近,学习了hibernate的一些使用方法和技巧。这里对什么是hibernate就不再赘述了

。下面我将对hibernate中的检索方式,谈谈我的心得:

在hibernate中大致有默认情况、左外连接、迫切左外连接、内连接、迫切内连接、右外连接等几种方式。这里,假设程序中有一个Customer和Order两个PO对象:

package com.javasky.po;

import java.util.HashSet;
import java.util.Set;

/**
* Customers entity. @author MyEclipse Persistence Tools
*/

public class Customer implements java.io.Serializable {

// Fields

private Long id;
private String name;
private Integer age;
private Set orders = new HashSet(0);

// Constructors

/** default constructor */
public Customer() {
}

/** minimal constructor */
public Customer(Long id) {
this.id = id;
}

/** full constructor */
public Customers(Long id, String name, Integer age, Set orders) {
this.id = id;
this.name = name;
this.age = age;
this.orders = orders;
}

// Property accessors
//getXXX()和setXXX()方法

}

package com.javasky.po;

/**
* Orders entity. @author MyEclipse Persistence Tools
*/

public class Order implements java.io.Serializable {

// Fields

private Long id;
private Customer customer;
private String orderNumber;
private Double price;

// Constructors

/** default constructor */
public Order() {
}

/** minimal constructor */
public Orde(Long id) {
this.id = id;
}

/** full constructor */
public Order(Long id, Customer customer, String orderNumber, Double price) {
this.id = id;
this.customer = customer;
this.orderNumber = orderNumber;
this.price = price;
}

// Property accessors
//getXXX()和setXXX()方法

}

在Cusoters.hbm.xml文件中对orders集合使用了延迟检索策略。在MySQL数据库中创建了CUSTOMERS和ORDERS两张表,ORDERS表参考CUSOTMERS表的主键。

(1)默认情况:查询单个CUSTOMERS表,对orders集合采用延迟检索策略。结果集中包含Customer类型的元素;Customer对象的orders集合没有被初始化。

(2)左外连接:左外连接查询CUSTOMERS表和ORDERS表,对orders集合采用延迟检索策略。结果集合中包含对象数组类型元素,每个对象数组包含一对Customer对象和Order对象,不同对象数组可能重复引用一个Customer对象;集合不被初始化。

(3)迫切左外连接:左外连接查询CUSTOMERS表和ORDERS表,对orders采用迫切左外连接检索策略。结果集合中包含Customer类型的元素;集合中可能有重复的元素;Customer对象的orders集合被初始化。

(4)内连接:内连接查询CUSTOMERS表和ORDERS表,对orders集合采用延迟检索策略。结果集合中包含对象数组类型元素,每个对象数组包含一对Customer对象和Order对象,不同对象数组可能重复引用一个Customer对象;集合不被初始化。

(5)迫切内连接:内连接查询CUSTOMERS表和ORDERS表,对orders集合采用迫切内连接检索策略。结果集合中包含Customer类型元素;集合中可能有重复的元素;集合被初始化。

(6)右连接:右连接查询CUSTOMERS表和ORDERS表,延迟检索策略。结果集合中包含对象数组类型元素,每个对象数组包含一对Customer对象和Order对象,不同对象数组可能重复引用一个Customer对象;集合不被初始化。

迫切左外连接和左外连接对应同样的的左外连接SQL查询语句,区别在于前者对Customer对象的orders集合初始化,而后者没有初始化。

对象数组类型:是指在执行HQL或QBC语句后返回的结果集中不是持久化对象,而是关系数据,前者存放在session缓存中,后者接近于一般的SQL语句查询。以内连接为例说明如下:
List list = session.createQuery("from Customer c join c.orders o where c.name like 'T%'").list();
Object[] os = null;
for(Iterator it = list.iterator();it.hasNext();){
os = (Object[])it.next();
Customer customer = (Customer)os[0];
Order order = (Order)os[1];
//若orders集合使用了延迟检索策略,下面代码会初始化Customer对象的orders集合
customer.getOrders().iterator();
}本文出自 “JAVASKY” 博客,请务必保留此出处http://javasky.blog.51cto.com/2025264/387539
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: