background image

Java 应用数据库:Hibernate 对多表关联查询

由于公司项目的需要,我对 Hibernate 对多表关联查询研究了一下,现总结如下,供朋友
参考。

 

  一、Hibernate 简介 Hibernate 是一个 JDO 工具。它的工作原理是通过文件(一般有两种:
xml 文件和 properties 文件)把值对象和数据库表之间建立起一个映射关系。这样,我们只
需要通过操作这些值对象和 Hibernate 提供的一些基本类,就可以达到使用数据库的目的。
例如,使用 Hibernate 的查询,可以直接返回包含某个值对象的列表(List),而不必向传统
的 JDBC 访问方式一样把结果集的数据逐个装载到一个值对象中,为编码工作节约了大
量的时间。Hibernate 提供的 HQL 是一种类 SQL 语言,它和 EJBQL 一样都是提供对象化的
数据库查询方式,但 HQL 在功能和使用方式上都非常接近于标准的 SQL.

 

  二、 Hibernate 与 JDBC 的区别 Hibernate 与 JDBC 的主要区别如下:
  1  

、 Hibernate 是 JDBC 的轻量级的对象封装,它是一个独立的对象持久层框架,和

App Server,和 EJB 没有什么必然的联系。Hibernate 可以用在任何 JDBC 可以使用的场合,
从某种意义上来说,Hibernate 在任何场合下取代 JDBC.
  2  

、 Hibernate 是一个和 JDBC 密切关联的框架,所以 Hibernate 的兼容性和 JDBC 驱动,

和数据库都有一定的关系,但是和使用它的 Java 程序,和 App Server 没有任何关系,也
不存在兼容性问题。
  3  

、 Hibernate 是做为 JDBC 的替代者出现的,不能用来直接和 Entity Bean 做对比。

 

  三、 Hibernate 进行多表关联查询 Hibernate 对多个表进行查询时,查询结果是多个表

 

的笛卡尔积,或者称为 交叉 连接。例如:from Student  

, Book from Student 

as

 stu

 

, Book 

as

 boo from Student stu

 

, Book boo 注意:让查询中的 Student 和 Book 均是表 student 和

book 对应的类名,它的名字一定要和类的名字相同,包括字母的大小写。别名应该服从
首字母小写的规则是一个好习惯,这和 Java 对局部变量的命名规范是一致的。
  下面列举一个完整的例子来说明 Hibernate 对多个表进行关联查询(其中粗体是我们要
特别注意的地方,相应表 tBookInfo 和 BookSelection 的结构和其对应的 hbm.xml、

class

件就不一一列举了,有需要详细了解的朋友,请联系我):
  String sTest = "from tBookInfo book, BookSelection sel where book.id = sel.bookId";
  Collection result = 

new

 ArrayList();

  Transaction tx = null;
  

try

 {

  Session session = HibernateUtil.currentSession();
  tx = session.beginTransaction();
  Query query = session.createQuery(sql);
  result = query.list();
  tx.commit();
  } 

catch

 (Exception e) {

  

throw

 e;

  } finally {