2016년 12월 14일 수요일

[자바교육,스프링교육,JPA교육학원_탑크리에듀][스프링JPA강좌,교육]QueryDSL4.X,서브쿼리,조인,exists(),max()예문 입니다.

[스프링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; 
}

댓글 없음:

댓글 쓰기