HQL常用連接類型
- 內(nèi)連接 inner join 或 join
- 迫切內(nèi)連接 inner join fetch 或 join fetch
- 左外連接 left outer join 或 left join
- 迫切左外連接 left outer join fetch 或 left join fetch
- 右外連接 right outer join 或 right join
內(nèi)連接 獲取的就是兩個表中的交集部分
左連接會讀取左邊數(shù)據(jù)表的全部數(shù)據(jù),即使右邊數(shù)據(jù)表沒有對應(yīng)數(shù)據(jù)。
右連接會讀取右邊數(shù)據(jù)表的全部數(shù)據(jù)桩盲,即使左邊數(shù)據(jù)表沒有對應(yīng)數(shù)據(jù)蜜笤。
內(nèi)連接 查詢部門和員工信息 from Entity [inner] join Entity.property
List<Object[]> objects=this.getCurrentSession().createQuery("from Department d join d.emps").list();
for(Object[] object:objects)
{
System.out.println(object[0]+"\t"+object[1]);
}
Hibernate:
select
department0_.deptNo as deptNo0_0_,
emps1_.empNo as empNo1_1_,
department0_.deptName as deptName0_0_,
department0_.location as location0_0_,
emps1_.empName as empName1_1_,
emps1_.job as job1_1_,
emps1_.salary as salary1_1_,
emps1_.deptNo as deptNo1_1_
from
project.Department department0_
inner join
project.Emp emps1_
on department0_.deptNo=emps1_.deptNo
list集合中的每個元素都是一個Object數(shù)組,數(shù)組的第一個元素時Dept元素對象饶唤,第二個元素時Emp對象姐直,Dept對象的emps集合元素沒有被初始化慕嚷,即emps集合里沒有存放關(guān)聯(lián)的Emp對象。Unable to evaluate the expression Method threw 'org.hibernate.LazyInitializationException' exception.
迫切內(nèi)連接查詢部門和員工信息from Entity [inner] join fetch Entity.property
List<Department> objects=this.getCurrentSession().createQuery("select distinct d from Department d join fetch d.emps").list();
for(Department department:objects)
{
System.out.println(department.getEmps());
}
Hibernate:
select
department0_.deptNo as deptNo0_0_,
emps1_.empNo as empNo1_1_,
department0_.deptName as deptName0_0_,
department0_.location as location0_0_,
emps1_.empName as empName1_1_,
emps1_.job as job1_1_,
emps1_.salary as salary1_1_,
emps1_.deptNo as deptNo1_1_,
emps1_.deptNo as deptNo0_0__,
emps1_.empNo as empNo0__
from
project.Department department0_
inner join
project.Emp emps1_
on department0_.deptNo=emps1_.deptNo
list集合中的每個元素都是Dept對象谐檀,Hibernate使用fetch關(guān)鍵字實(shí)現(xiàn)了將Emp對象讀出來后立即填充到對應(yīng)的Dept對象的集合屬性中。如果有一些Dept對象裁奇,可以使用select distinct d from Dept d inner join fetch d.emps解決桐猬。
左外連接 from Entity left [outer] join Entity.property
List<Object[]> objects=this.getCurrentSession().createQuery("from Department d left join d.emps").list();
for (Object[] object:objects)
{
System.out.println(object[0]+"\t"+object[1]);
}
Hibernate:
select
department0_.deptNo as deptNo0_0_,
emps1_.empNo as empNo1_1_,
department0_.deptName as deptName0_0_,
department0_.location as location0_0_,
emps1_.empName as empName1_1_,
emps1_.job as job1_1_,
emps1_.salary as salary1_1_,
emps1_.deptNo as deptNo1_1_
from
project.Department department0_
left outer join
project.Emp emps1_
on department0_.deptNo=emps1_.deptNo
迫切左外連接from Entity left [outer] join fetch Entity.property
List<Department> objects=this.getCurrentSession().createQuery("select distinct d from Department d left join fetch d.emps").list();
for (Department department:objects)
{
System.out.println(department.getEmps());
}
Hibernate:
select
distinct department0_.deptNo as deptNo0_0_,
emps1_.empNo as empNo1_1_,
department0_.deptName as deptName0_0_,
department0_.location as location0_0_,
emps1_.empName as empName1_1_,
emps1_.job as job1_1_,
emps1_.salary as salary1_1_,
emps1_.deptNo as deptNo1_1_,
emps1_.deptNo as deptNo0_0__,
emps1_.empNo as empNo0__
from
project.Department department0_
left outer join
project.Emp emps1_
on department0_.deptNo=emps1_.deptNo
右外連接 from Entity right [outer] join Entity.property
List<Object[]> objects=this.getCurrentSession().createQuery("from Department d right join d.emps").list();
for (Object[] object:objects)
{
System.out.println(object[0]+"\t"+object[1]);
}
Hibernate:
select
department0_.deptNo as deptNo0_0_,
emps1_.empNo as empNo1_1_,
department0_.deptName as deptName0_0_,
department0_.location as location0_0_,
emps1_.empName as empName1_1_,
emps1_.job as job1_1_,
emps1_.salary as salary1_1_,
emps1_.deptNo as deptNo1_1_
from
project.Department department0_
right outer join
project.Emp emps1_
on department0_.deptNo=emps1_.deptNo
隱式內(nèi)連接 按部門條件查詢員工信息
List<Emp> emps=this.getCurrentSession().createQuery("from Emp e where e.department.deptNo=:deptNo")
.setParameter("deptNo",deptNo)
.list();
Hibernate:
select
emp0_.empNo as empNo1_,
emp0_.empName as empName1_,
emp0_.job as job1_,
emp0_.salary as salary1_,
emp0_.deptNo as deptNo1_
from
project.Emp emp0_
where
emp0_.deptNo=?
Hibernate:
select
department0_.deptNo as deptNo0_0_,
department0_.deptName as deptName0_0_,
department0_.location as location0_0_
from
project.Department department0_
where
department0_.deptNo=?
List<Object[]> objects=this.getCurrentSession().createQuery(" select e.empName,e.department.deptName from Emp e").list();
Hibernate:
select
emp0_.empName as col_0_0_,
department1_.deptName as col_1_0_
from
project.Emp emp0_,
project.Department department1_
where
emp0_.deptNo=department1_.deptNo