2016년 3월 23일 수요일

[JPA,Querydsl강좌]SQLQueryFactory,JPA,조인,서브쿼리,그룹핑,정렬예문(JPA, NativeSQL) 

SQLQueryFactory를 이용하면 자바쪽에 엔티티를 만들지 않고 DB로 쿼리 할 수 있다. 
(물론 이를 위해 쿼리타입이라는 클래스는 만들어져 있어야 한다.) 

기존 NativeSQL을 이용하여 DB의 SQL구문형식대로 만들어 쿼리했던 방식을 JPA의 메소드 기반으로 쿼리할 수 있는 장점이 있다. 

간단히 예문을 보자. 

// Emp, Dept를 조인하여 사원명, 부서명 출력, 5길동은 부서가 없으므로 출력안됨 
List<Tuple> emps1 = queryFactory.select(emp.ename, dept.dname) 
.from(emp) 
.innerJoin(dept) 
.on(emp.deptno.eq(dept.deptno)) 
.fetch(); 

for (Tuple row : emps1) { 
System.out.println(row.get(emp.ename) + ":" + row.get(dept.dname)); 

System.out.println("----------------2"); 

// Emp, Dept를 조인하여 사원명, 부서명 출력, 부서없는 5길동도 출력 
List<Tuple> emps2 = queryFactory.select(emp.ename, dept.dname) 
.from(emp) 
.leftJoin(dept) 
.on(emp.deptno.eq(dept.deptno)) 
.fetch(); 

for (Tuple row : emps2) { 
System.out.println(row.get(emp.ename) + ":" + row.get(dept.dname)); 

System.out.println("----------------3"); 

// Emp 테이블에서 부서별로 그룹핑하여 부서명, 급여합 출력 
// 단 급여평균이 2000 이상인 부서만 
List<Tuple> emps3 = queryFactory.select(dept.dname, emp.sal.sum()) 
.from(emp) 
.innerJoin(dept) 
.on(emp.deptno.eq(dept.deptno)) 
.groupBy(emp.deptno) 
.having(emp.sal.avg().gt(2000))
.fetch(); 

for (Tuple row : emps3) { 
System.out.println(row.get(dept.dname) + ":" 
                    + row.get(1, Long.class)); 

System.out.println("----------------4"); 

//Emp 테이블에서 급여최소인 사원의 모든 칼럼 추출 
SEmp e = new SEmp("e"); 
List<Tuple> emps4 = queryFactory.select(emp.all()) 
                .from(emp) 
            .where(emp.sal.eq( 
              SQL__EXPRESSION__s.select(e.sal.min()).from(e))) 
            .fetch(); 
for (Tuple row : emps4) { 
System.out.println(row.get(emp.ename) + ":" 
                    + row.get(emp.sal)); 

System.out.println("----------------4"); 

//Emp 테이블에서 job별 최소급여 사원의 ename, job, sal 출력 
List<Tuple> emps5 = queryFactory.select(emp.ename, emp.job, emp.sal) 
      .from(emp) 
      .where(emp.sal.eq( 
            SQL__EXPRESSION__s.select(e.sal.min()).from(e) 
              .where(emp.job.eq(e.job)))) 
  .fetch(); 

for (Tuple row : emps5) { 
System.out.println(row.get(emp.job) + ":" 
                    + row.get(emp.ename) + ":" 
        + row.get(emp.sal)); 

System.out.println("----------------5"); 

//"1길동" 사원과 같은 부서에 있는 사원중 최대급여 사원의 이름 및 급여, 부서명출력 
List<Tuple> emps6 = queryFactory.select(emp.ename, emp.sal, dept.dname) 
.from(emp) 
.innerJoin(dept).on(emp.deptno.eq(dept.deptno)) 
.where(emp.deptno.eq( 
SQL__EXPRESSION__s 
.select(e.deptno) 
.from(e) 
.where(e.ename.eq("1길동"))
    ).and(emp.sal.eq( 
    SQL__EXPRESSION__s 
    .select(e.sal.max()) 
    .from(e) 
    .where(emp.deptno.eq(e.deptno)) 
    ))) 
                .fetch(); 

for (Tuple row : emps6) { 
System.out.println(row.get(emp.ename) + ":" 
                    + row.get(emp.sal) + ":" 
        + row.get(dept.dname)); 

System.out.println("----------------6"); 

댓글 없음:

댓글 쓰기