使用HQL进行连接查询。
Hibernate应用中,实体类的关联关系已经在hbm.xml中进行了配置,HQL中的连接查询分为隐式(implicit)和显示(explicit)两种。
1、隐式连接查询
隐式连接查询不使用join关键字,默认是inner join的规则,即内连接。
测试基于one-to-one关系的隐式连接查询:
String hql1 = "select p from People p where p.passport.expiry=6";
List<People> list = session.createQuery(hql1).list();
for(People p:list){
System.out.println(p.getId()+" "+p.getName());
}
一对多关系的隐式查询:
String hql2 = "select p from Person p where size(p.addresses)>1";
List<Person> list = session.createQuery(hql2).list();
for(Person p:list){
System.out.println(p.getName());
}
2、显示连接查询
与SQL语言类似,HQL中的显示连接查询也有三种,及inner join、left outer join和right outer join,含义也有SQL中的关联查询类似。
可以简写成join、left join和right join。
String hql1 = "select p from People p join p.passport passport where passport.expiry=6";
List<People> list = session.createQuery(hql1).list();
for(People p:list){
System.out.println(p.getId()+" "+p.getName());
}
测试左外连接的显示查询:
String hql2 = "select p from People p left join p.passport passport";
List<People> list = session.createQuery(hql2).list();
for(People p:list){
System.out.println(p.getId()+" "+p.getName());
}
测试右外连接的显示查询:
String hql3 = "select p from People p right join p.passport passport";
List<People> list = session.createQuery(hql3).list();
for(People p:list){
System.out.println(p.getId()+" "+p.getName());
}
在一对多关联关系中也可以使用显示连接查询:
String hql4 = "select p from Person p left join p.addresses addresser where addresses is null";
List<Person> list = session.createQuery(hql4).list();
for(Person p:list){
System.out.println(p.getName());
}