Hibernate級聯(lián)查詢(HQL)
拿雇員(Employee)與部門(Department)來舉例子說明
1.1 數(shù)據(jù)庫模型
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級聯(lián)查詢的HQL語句時,與傳統(tǒng)的JDBC方式有著本質(zhì)的區(qū)別
1.4.1 JDBC級聯(lián)寫法
SELECT * FROM employee INNER JOIN department ON employee.deptid= department.id
|
1.4.2 HQL級聯(lián)寫法
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
|
注意紅色字體部分,在傳統(tǒng)的SQL語句中inner join后面跟級聯(lián)的表,但在HQL中inner join后面跟能反映出級聯(lián)關(guān)系的字段屬性(與pojo中的名字必須高度保持一致),當(dāng)存在級聯(lián)時,Hibernate查詢結(jié)果為一對象數(shù)組,其數(shù)組的長度取決于select與from之間字段的個數(shù)。
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");
|
電子文檔下載