2016년 10월 28일 금요일

[자바강좌,JPA강좌,스프링강좌추천★탑크리에듀][스프링DATAJPA팁]Querydsl4.0.8오라클쿼리WITH구문오류!!(Querydsl,오라클쿼리강좌)

[스프링DATAJPA팁]Querydsl4.0.8오라클쿼리WITH구문오류!!(Querydsl,오라클쿼리강좌)

아래와 같은 SQL 쿼리를 만들기 위해 
(WITH문을 이용하여 MYEMP1, MYDEPT1 테이블에서 부서명, 부서별직원평균급여 구하기) 

with myemp2 as ( 
  select MYEMP1.DEPTNO, avg(MYEMP1.SAL) sal 
  from TEST.MYEMP1 MYEMP1 
  group by MYEMP1.DEPTNO) 
select MYDEPT1.DNAME, myemp2.SAL 
from MYDEPT1 
inner join myemp2 
on MYDEPT1.DEPTNO = myemp2.DEPTNO 

다음과 같이 Querydsl4.0.8 버전에서 작성했는데 

QMyemp1 myemp1 = new QMyemp1.myemp1; 
QMyemp1 myemp2 = new QMyemp1("myemp2"); 

List<Tuple> depts  = queryFactory.query() 
.with(myemp2, 
SQLExpressions 
.select(myemp1.deptno, myemp1.sal.avg().as("sal")) 
.from(myemp1) 
.groupBy(myemp1.deptno)) 
                .select(mydept1.dname, myemp2.sal) 
                .from(mydept1) 
                .innerJoin(myemp2).on(mydept1.deptno.eq(myemp2.deptno)) 
                .fetch(); 


Querydsl4.0.8 버전에서는 WITH구문이 다음과 같이 해석된다. 
(innerjoin에서 WITH구문에서 만든 myemp2와 조인을 해야되는데 
 myemp1 테이블과 조인하여 이상한 결과가 나오게 된다. ) 


with myemp2 as ( 
  select MYEMP1.DEPTNO, avg(MYEMP1.SAL) sal 
  from TEST.MYEMP1 MYEMP1 
  group by MYEMP1.DEPTNO) 
select MYDEPT1.DNAME, myemp2.SAL 
from MYDEPT1 
join MYEMP1 myemp2 
on MYDEPT1.DEPTNO = myemp2.DEPTNO 


Querydsl 버전을 4.0.9 이상으로 올리자. 
잘 동작된다.

댓글 없음:

댓글 쓰기