1. 立即左外连接
以下程序覆盖映射代码中指定的检索策略,显式指定对与Customer关联的Order对象采用立即左外连接检索策略:
//JPQL检索方式
List<Customer> result=entityManager
.createQuery("from Customer c left join fetch c.orders o "
+"where c.name like 'T%' ",Customer.class)
.getResultList();
//QBC检索方式
CriteriaQuery<Customer> criteriaQuery =
criteriaBuilder.createQuery(Customer.class);
Root<Customer> root = criteriaQuery.from(Customer.class );
root.fetch("orders",JoinType.LEFT);
criteriaQuery.select(root);
Predicate predicate = criteriaBuilder.like(
root.get("name"),"T%");
criteriaQuery.where(predicate);
List<Customer> result=entityManager
.createQuery(criteriaQuery)
.getResultList();
以上代码生成的SQL查询语句为:
select c.ID C_ID ,c.NAME, c.AGE,
o.ID O_ID, o.ORDER_NUMBER, o.CUSTOMER_ID
from CUSTOMERS c left outer join ORDERS o on c.ID=o.CUSTOMER_ID
where (c.NAME like 'T%');
2. 左外连接
以下代码分别通过JPQL和QBC进行左外连接查询:
//JPQL检索方式
List<Object[]> result=entityManager
.createQuery("from Customer c left join c.orders "
+" where c.name like 'T%'",Object[].class)
.getResultList();
//QBC检索方式
//“Object[]”设定查询结果中的元素的类型
CriteriaQuery<Object[]> criteriaQuery =
criteriaBuilder.createQuery(Object[].class);
Root<Customer> root = criteriaQuery.from(Customer.class );
Join<Customer,Order> orderJoin=root.join("orders",JoinType.LEFT);
//由于查询结果中的每个元素都包含了Customer对象和Order对象,
//此时需要调用CriteriaQuery的multiselect()方法</