参看易百教程:https://www.yiibai.com/jpa/jpa_jpql.html
1 关联查询
1.1 概念
在JPQL中,很多时候都是通过在实体类中配置实体关联的类属性来实现隐含的关联(join)查询。例如:
select o from Orders o whereo.address.streetNumber=2000
上述JPQL语句编译成以下SQL时就会自动包含关联,默认为左关联。
在某些情况下可能仍然需要对关联做精确的控制。为此,JPQL 也支持和 SQL 中类似的关联语法。如:
left out join /left join
inner join
left join /inner join fetch
其中,left join和left out join等义,都是允许符合条件的右边表达式中的实体为空。
1.2 问题
• 例如,以下外关联查询可以找出所有客户实体记录,即使它未曾订货:
select c from Customers c left join c.orderso
• 以下内关联查询只找出所有曾订过商品的客户实体记录:
select c from Customers c inner joinc.orders o
• 如果001号客户下过5次订单的话,以下fetch关联查询将得到 5个客户实体的引用,并且执行了 5 个订单的查询:
select c from Customers c left join fetchc.orders o where c.id=001
1.3 测试代码
1.3.1 返回单个
/**
* JPQL 的关联查询同 HQL 的关联查询.
*/
@Test
public void testLeftOuterJoinFetch(){
Stringjpql= "FROM Customer c LEFT OUTER JOIN FETCHc.orders WHERE c.id = ?";
Customercustomer=
(Customer)entityManager.createQuery(jpql).setParameter(1,11).getSingleResult();
System.out.println(customer.getLastName());
System.out.println(customer.getOrders().size());
}
1.3.2 返回多个
/**
* JPQL 的关联查询同 HQL 的关联查询.
*/
@Test
public void testLeftOuterJoinFetch(){
Stringjpql= "FROM Customer c LEFT OUTER JOIN FETCHc.orders WHERE c.id = ?";
List<Object[]>result= entityManager.createQuery(jpql).setParameter(1, 18).getResultList();
System.out.println(result);
}