Hibernate级联查询(HQL)
拿雇员(Employee)与部门(Department)来举例子说明
1.1 数据库模型
1.1.1 Employee表
DROP TABLE IF EXISTS employee;
CREATE TABLE employee (
id int(11) NOT NULL auto_increment,
empname varchar(255) default NULL,
empage int(11) default NULL,
context varchar(255) default NULL,
deptid int(11) default NULL,
PRIMARY KEY (id),
KEY FK4722E6AEAD9148B6 (deptid)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
|
1.1.2 Department表
DROP TABLE IF EXISTS department;
CREATE TABLE department (
id int(11) NOT NULL auto_increment,
deptname varchar(255) default NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
|
1.2 Java类
publicclass Employee
{
private Integer id;
private String empname;
private Integer empage;
private String context;
private Integer deptid;
private Department department=new Department();
//此处省略set()、get()方法
}
|
publicclass Department
{
private Integer id;
private String deptname;
private Set<Employee> employeeSet=new HashSet<Employee>();
//此处省略set()、get()方法
}
|
1.3 映射文件
<hibernate-mapping package="com.dl.bean">
<class name="Employee" table="employee">
<id name="id" >
<generator class="native"/>
</id>
<property name="empname"/>
<property name="empage"/>
<property name="context" />
<property name="deptid" insert="false" update="false"/>
<many-to-one name="department" column="deptid" cascade="all" class="Department" />
</class>
</hibernate-mapping>
|
<hibernate-mapping package="com.dl.bean">
<class name="Department" table="department">
<id name="id" >
<generator class="native"/>
</id>
<property name="deptname" />
<set name="employeeSet">
<key column="deptid"></key>
<one-to-many class="Employee"/>
</set>
</class>
</hibernate-mapping>
|
1.4 在写Hibernate级联查询的HQL语句时,与传统的JDBC方式有着本质的区别
1.4.1 JDBC级联写法
SELECT * FROM employee INNER JOIN department ON employee.deptid= department.id
|
1.4.2 HQL级联写法
select
employee.id,
employee.empname,
employee.empage,
employee.context,
employee.department.deptname
from
Employee employee
inner join employee.department (此处与前文中Employee类中的属性名一致)
order by employee.id desc
|
注意红色字体部分,在传统的SQL语句中inner join后面跟级联的表,但在HQL中inner join后面跟能反映出级联关系的字段属性(与pojo中的名字必须高度保持一致),当存在级联时,Hibernate查询结果为一对象数组,其数组的长度取决于select与from之间字段的个数。
1.5 注意分析下面三条语句看有什么不同
SQLQuery方式
sqlquery=session.createSQLQuery("select employee.id,employee.empname,employee.empage,employee.context,department.deptname from employee inner join department on employee.deptid=department.id");
|
Query方式:
session.createQuery("select employee.id,employee.empname,employee.empage,employee.context,employee.department.deptname from Employee employee inner join employee.department order by employee.id desc");
|
Query方式:
Query query=session.createQuery("select employee.empname, employee.department from Employee as employee order by employee.id desc");
|
电子文档下载