[스프링JPA강좌,교육]QueryDSL4.X,서브쿼리,조인,exists(),max()예문 입니다.
롬복(Lombok)설치는다음 URL 참조
http://ojc.asia/bbs/board.php?bo_table=LecSpring&wr_id=561
마리아 DB 설치는다음 URL 참조
http://ojc.asia/bbs/board.php?bo_table=LecSpring&wr_id=524
1. Emp, Dept 엔티티는 다음과 같다.
@Entity
@Getter
@Setter
@NamedQuery(name="Emp.findBySalNamed",
query="select e from Emp e where e.sal > :sal")
public class Emp {
@Id
@GeneratedValue
private Long empno;
private String ename;
private String job;
private Long sal;
@ManyToOne
@JoinColumn(name = "deptno")
private Dept dept;
}
@Entity
@Getter
@Setter
@NoArgsConstructor
public class Dept {
@Id
@GeneratedValue
private Long deptno;
@Column(unique=true)
private String dname;
public Dept(String dname) {
this.dname = dname;
}
}
2. 예문
@Override
// Emp 테이블에서 job을 조건으로 검색, 이름 내림차순으로
public List<Emp> selectByJobOrderByEnameDesc(String job) {
JPAQuery<?> query = new JPAQuery<Void>(em);
QEmp emp = QEmp.emp;
List<Emp> emps = query.select(emp).from(emp)
.where(emp.job.eq(job))
.orderBy(emp.ename.desc()).fetch();
return emps;
}
@Override
@Transactional
/* job을 입력받아 EMP 삭제 */
public void deleteByJob(String job) {
QEmp emp = QEmp.emp;
new JPADeleteClause(em, emp)
.where(emp.job.eq(job))
.execute();
}
// 사번과 새이름을 입력받아 이름을 변경
@Override
@Transactional
public void updateByEmpno(Long empno, String newEname) {
QEmp emp = QEmp.emp;
new JPAUpdateClause(em, emp)
.where(emp.empno.eq(empno))
.set(emp.ename, newEname)
.execute();
}
// job을 검색조건으로 ename, job 추출
@Override
public List<Tuple> selectEnameJobByEmpno(Long empno) {
JPAQuery<?> query = new JPAQuery<Void>(em);
QEmp emp = QEmp.emp;
//Multi Column Select
List<Tuple> result = query.select(emp.ename, emp.job).from(emp)
.where(emp.empno.eq(empno))
.fetch();
return (List<Tuple>)result;
}
// Emp 테이블 1번부서원 이름 및 부서명을 추출하는데 Dept 테이블과 조인
부서코드를 안가지는 사원은 추출되지 않는다
@Override
public List<Tuple> selectEmpEnameDnameJoinDept(Long deptno) {
JPAQuery<?> query = new JPAQuery<Void>(em);
QEmp emp = QEmp.emp;
QDept dept = QDept.dept;
List<Tuple> emps = query.select(emp.ename, dept.dname).from(emp)
.innerJoin(emp.dept, dept)
.where(emp.dept.deptno.eq(deptno))
.fetch();
return emps;
}
// Emp 테이블에서 최대급여 사원 추출, 서브쿼리
@Override
public List<Emp> selectEmpMaxSal() {
JPAQuery<?> query = new JPAQuery<Void>(em);
QEmp emp = QEmp.emp;
QEmp e = new QEmp("e");
List<Emp> emps = query.select(emp).from(emp)
.where(emp.sal.eq(
JPAExpressions.select(e.sal.max()).from(e)))
.fetch();
return emps;
}
// 부서별 최대급여받는 사원 추출 , 서브쿼리
@Override
public List<Emp> selectEmpMaxSalOfDept() {
JPAQuery<?> query = new JPAQuery<Void>(em);
QEmp emp = QEmp.emp;
QEmp e = new QEmp("e");
List<Emp> emps = query.select(emp).from(emp)
.where(emp.sal.eq(
JPAExpressions
.select(e.sal.max()).from(e)
.where(emp.dept.deptno.eq(e.dept.deptno))
))
.fetch();
return emps;
}
// 자신이 속한 부서의 평균급여보다 급여가 많은 사원추출 ,서브쿼리
@Override
public List<Emp> selectEmpGreaterThanAvgSal() {
JPAQuery<?> query = new JPAQuery<Void>(em);
QEmp emp = QEmp.emp;
QEmp e = new QEmp("e");
List<Emp> emps = query.select(emp).from(emp)
.where(emp.sal.gt(
JPAExpressions
.select(e.sal.avg()).from(e)
.where(emp.dept.deptno.eq(e.dept.deptno))
))
.fetch();
return emps;
}
// 입력받은 사원과 급여가 같은 사원추출 , 서브쿼리
// 입력받은 사원은 출력안함
@Override
public List<Emp> selectEmpEqualsEmpno(Long empno) {
JPAQuery<?> query = new JPAQuery<Void>(em);
QEmp emp = QEmp.emp;
QEmp e = new QEmp("e");
List<Emp> emps = query.select(emp).from(emp)
.where(emp.sal.eq(
JPAExpressions
.select(e.sal).from(e)
.where(e.empno.eq(empno))
))
.where(emp.empno.ne(empno))
.fetch();
return emps;
}
// Emp 테이블에서 급여상위 3명 추출 , 서브쿼리
@Override
public List<Emp> selectEmpMaxSalTop3() {
JPAQuery<?> query = new JPAQuery<Void>(em);
QEmp emp = QEmp.emp;
List<Emp> emps = query.select(emp).from(emp)
.orderBy(emp.sal.desc())
.limit(3)
.fetch();
return emps;
}
// Dept 테이블에서 사원이 한명이라도 존재하는 부서추출, 서브쿼리
@Override
public List<Dept> selectDeptExistsEmp() {
JPAQuery<?> query = new JPAQuery<Void>(em);
QEmp emp = QEmp.emp;
QDept dept = QDept.dept;
List<Dept> depts = query.select(dept).from(dept)
.where(JPAExpressions
.selectFrom(emp)
.where(emp.dept.deptno.eq(dept.deptno)).exists()
)
.fetch();
return depts;
}
댓글 없음:
댓글 쓰기