JPA中如何实现多表查询?

在JPA中可以通过JPQL的JOIN关键字实现多表查询。
JOIN用于连接两个实体,当查询一个实体时可以同时查询关联的实体,这种查询方式就是多表查询。

语法:

sql
SELECT ... FROM EntityName e1 
JOIN EntityName e2 ON ... 

示例:

String jpql = "SELECT u, a FROM User u JOIN Address a ON u.id = a.user.id";
Query query = em.createQuery(jpql);
List<Object[]> results = query.getResultList();
Object[] result = results.get(0);
User user = (User) result[0]; 
Address address = (Address) result[1];

上例查询User实体同时关联查询Address实体,并将结果作为Object数组返回,我们可以分别获取User和Address对象。

JOIN类型:

  • INNER JOIN:如果左表和右表的连接字段没有匹配,则忽略此行。
  • LEFT JOIN:即使右表没有对应匹配,也会从左表返回所有的行。不匹配的右表列使用NULL填充。
  • RIGHT JOIN:即使左表没有对应匹配,也会从右表返回所有的行。不匹配的左表列使用NULL填充。

示例:

String jpql = "SELECT u, a FROM User u LEFT JOIN Address a ON u.id = a.user.id"; 

上例使用LEFT JOIN,即使某User没有关联的Address,也会返回User对象以及NULL Address对象。

JOIN的优点:

  1. 可以查询跨表的数据,返回结果集包含多表关联的实体。
  2. 实现一对一、一对多和多对多关联关系的查询。
  3. LEFT JOIN和RIGHT JOIN可以实现外连接查询,返回有关联或无关联的数据。