JPA学习 —— 第十四课、 关连查询

关于内连和外连

内连接
就是inner join,关连双方互相关联,不是以哪一方为主。必须有关联到,如果没有关联到数据,则被舍弃。属于关联中最小集。
外连接
外连接out join 分为左(外)连接left (out) join 和右(外)连接right (out) join ,通常”外”可以省略。
left join

select * from a left join b on a.xx=b.xx;

左连接left join是以左表a为基准关联右表b,不管有没有关联到数据,最终的结果都是a表被全部查出来,b表以被关连的身份附着于a表。所以这种查询结果集大于等于a表容量。

right join
left join相反以b表为基准。

上面简单讲了sql中的一些关连查询的语法知识,下面来看看关连查询在JPQL中的应用。

使用关联关系查询:
就是用多对一什么的创建外键查询,具体的之前博客都有,略…
查询:

String jpql ="select e FROM Employee e WHERE e.id = ?";
Query query = em.createQuery(jpql);
query.setParameter(1, 1);
Employee emp = (Employee)query.getSingleResult();
System.out.println(emp);

查询情况:
这里写图片描述
两次select,没有使用关连查询

这里我们可以使用left outer join关联查询,只调用一次查询

String jpql = "select e FROM Employee e left outer join fetch e.department WHERE e.id = ?";

上面语句不经使用了走外连接查询还使用了fetch ,其实left join和inner join在这里使用主要是为了配合fetch,一次抓取,因为默认的一般都是懒加载

查询情况:
这里写图片描述
可以看到使用了左外连接一次查询两个表。
上面能够执行成功必须配置关联关系,我这里使用的多对一关系@ManyToOne

如果不配置关联关系还能不能使用关连查询呢?当然可以。
改造之前配置了关联关系的多方实体类:

package com.ssj.domain;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name="employee")
public class Employee {

    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Id
    @Column(name="ID")
    private Integer Id;

    @Column(name="EMP_NAME")
    private String empName;

    @Column(name="EMP_BIRTH")
    @Temporal(TemporalType.DATE)
    private Date empBirth;

    @Column(name="DEPT_ID")
    private Integer deptId;

    public Integer getId() {
        return Id;
    }
    public void setId(Integer id) {
        Id = id;
    }
    public String getEmpName() {
        return empName;
    }
    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public Date getEmpBirth() {
        return empBirth;
    }
    public void setEmpBirth(Date empBirth) {
        this.empBirth = empBirth;
    }
    public Integer getDeptId() {
        return deptId;
    }
    public void setDeptId(Integer deptId) {
        this.deptId = deptId;
    }
    @Override
    public String toString() {
        return "Employee [Id=" + Id + ", empName=" + empName + ", empBirth="
                + empBirth + ", deptId=" + deptId + "]";
    }
}

删除关联关系的配置,直接创建一列DEPT_ID用来储存关连另一个表的数据,这里没有创建外键。

String jpql = "select u,d FROM Employee u left join Department d on u.deptId=d.id";

使用left join on 查询,查询情况:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/abc997995674/article/details/80237867