关于内连和外连
内连接
就是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 查询,查询情况: