[스프링JPA강좌]QueryDSL4.X,JPAQueryFactory쿼리예문(조인,서브쿼리,GroupBy,OrderBy,삭제,수정,조회) ,열심히공부하세요
감사합니다.
아래 예문 참조하세요~
--------------------------------------------------------------------------------------------------------------------------
@Autowired
JPAQueryFactory queryFactory;
////////////////////////////////// QueryDSL용 메소드
@Override
/* Emp 테이블에서 job을 조건으로 검색, 이름 내림차순으로 */
public List<Emp> selectByJobOrderByEnameDesc(String job) {
List<Emp> emps = queryFactory.selectFrom(emp)
.where(emp.job.eq(job))
.orderBy(emp.ename.desc()).fetch();
return emps;
}
@Override
@Transactional
/* job을 입력받아 EMP 삭제 */
public Long deleteByJob(String job) {
// new JPADeleteClause(em, emp)
// .where(emp.job.eq(job))
// .execute();
Long affectedRow = queryFactory.delete(emp)
.where(emp.job.eq(job))
.execute();
return affectedRow;
}
/* 사번과 새이름을 입력받아 이름을 변경 */
@Override
@Transactional
public Long updateByEmpno(Long empno, String newEname) {
// new JPAUpdateClause(em, emp)
// .where(emp.empno.eq(empno))
// .set(emp.ename, newEname)
// .execute();
Long affectedRow = queryFactory.update(emp)
.where(emp.empno.eq(empno))
.set(emp.ename, newEname)
.execute();
return affectedRow;
}
/* job을 검색조건으로 ename, job 추출 */
@Override
public List<Tuple> selectEnameJobByEmpno(Long empno) {
//Multi Column Select
List<Tuple> result = queryFactory.select(emp.ename, emp.job)
.from(emp)
.where(emp.empno.eq(empno))
.fetch();
return result;
}
/* Emp 테이블에서 job별로 GroupBy후 그룹별 급여평균추출
단 그룹의 급여 합계가 주어진 합보다 큰경우 */
@Override
public List<Tuple> selectSalAvgGroupbyJob(Long sumSal) {
List<Tuple> result = queryFactory
.select(emp.job, emp.sal.avg())
.from(emp)
.groupBy(emp.job)
.having(emp.sal.sum().gt(sumSal))
.fetch();
return result;
}
/* Emp 테이블에서 입력받은 부서원 이름 및 부서명을 추출하는데 Dept 테이블과 조인
부서코드를 안가지는 사원은 추출되지 않는다 */
@Override
public List<Tuple> selectEmpEnameDnameJoinDept(Long deptno) {
List<Tuple> emps = queryFactory
.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() {
QEmp e = new QEmp("e");
List<Emp> emps = queryFactory.selectFrom(emp)
.where(emp.sal.eq(
JPAExpressions.select(e.sal.max()).from(e)))
.fetch();
return emps;
}
/* 부서별 최대급여받는 사원 추출 , 서브쿼리 */
@Override
public List<Emp> selectEmpMaxSalOfDept() {
QEmp e = new QEmp("e");
List<Emp> emps = queryFactory.selectFrom(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() {
QEmp e = new QEmp("e");
List<Emp> emps = queryFactory.selectFrom(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) {
QEmp e = new QEmp("e");
List<Emp> emps = queryFactory.selectFrom(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() {
List<Emp> emps = queryFactory.selectFrom(emp)
.orderBy(emp.sal.desc())
.limit(3)
.fetch();
return emps;
}
/* Dept 테이블에서 사원이 한명이라도 존재하는 부서명추출, 서브쿼리 */
@Override
public List<String> selectDeptExistsEmp() {
List<String> depts = queryFactory.select(dept.dname).from(dept)
.where(JPAExpressions
.selectFrom(emp)
.where(emp.dept.deptno.eq(dept.deptno)).exists()
)
.fetch();
return depts;
}
댓글 없음:
댓글 쓰기