关于内连接、左外连接和迫切左外连接
程序员文章站
2022-05-01 18:09:24
...
举例说明:
需求:把用户和订单查询出来
情况一:内连接查询。即只查询有订单的用户。
from User u inner join u.orders o;
from User u left outer join fetch u.orders o;
注:左外连接语句中的fetch,表示迫切。即迫切左外连接。
什么叫迫切左外连接?
个人理解:
若将(迫切)左外连接左边的对象称为“主对象“,右边的对象称为”附属对象“。则使用左外连接时,查询出来的对象结构是主对象和附属对象组成的组成的一个对象数组,形如:Object[主对象,附属对象]。而使用迫切左外连接时,查询出来的对象结构是一个主对象,而附属对象作为住对象的一个属性值嵌在其中,形如:主对象
其他属性……...对应属性名:附属对象...其他属性……
相较之下,一般都是使用迫切左外连接
举例说明:
以左外连接的方式(第9行):
@Test
public void showUser(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring/applicationcontext.xml");
SessionFactory sessionFactory = (SessionFactory) context.getBean("sessionFactory");
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
List list = (List) session.createQuery("from User u left outer join u.department d").list();
tx.commit();
session.close();
}
在第11行打上断点,在方法名上右键→debug as→Junit Test,运行一会儿……,在9行的list上右键→watch
可看到效果如下图:
重点在这:(即User和Department组成了一个数组)
以迫切左外连接的方式:
将上述代码第9行改成如下形式:
List list = (List) session.createQuery("from User u left outer join fetch u.department d").list();
可看到效果如下:
重点在这:(即Department作为User的属性存在)