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"); |
電子文檔下載