[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");
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");
댓글 없음:
댓글 쓰기