ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • QueryDsl from subquery와 join을 해보자!
    JPA 2019. 9. 3. 22:33
    반응형

    php에 있는 batch query를 java로 마이그레이션 하는 작업중에 있다

    휴ㅎㅎ그냥 mybatis를 사용했다면 정말 쉽게 할 수 있는것이지만 오늘도 애를 먹은 경험을 공유하고 싶어서 글을 쓴다.

    위와 같은 예제 쿼리를 실했시켰더니 내가 생각한대로 결과가 나오겠지 하는 기대와 달리 다른 쿼리 결과가 생성되었다.

    분명 union all한 쿼리를 묶어서 goods 와 join을 해야 하는데 조인을 하지 않았다.

     

    사실은 맨 처음에는 SQLExpressions.union()를 사용했었는데 ExpressionUtils.as 에러가 발생하여서 jpasqlQuery 참조변수의 unionAll을 사용하였다.

     

    qGoods를 조인하는 부분을 제거 하고 from도 제거하고 unionAll만 셋팅해서 sql을 날려 보았는데

    위와 같은 sql이 실행되는 것이었다

     

    그래서 바보같이? 아 unionAll이 from으로 실행되는구나(사실 그냥 예측임 아닐지도 모름) jqasqlQuery 객체 하나당 하나의 from만 사용할 수 있기 때문에(사실 다른 from()를 지원해주는 객체도 마찬가지임) 아래와 같이 코드를 작성해 보았다.

     

    QGoods qGoods = QGoods.goods;
            QGoods qGoodsUnionOne = new QGoods("goodsUnionOne");
            QGoods qGoodsUnionTwo = new QGoods("goodsUnionTwo");
            QGoodsCoupon goodsCouponGtUpdateTime = new QGoodsCoupon("goodsCouponGtUpdateTime");
    
            JpaSqlCustomQuery jpasqlCustomQueryUnion = querydslHelper
                    .query();
    
            JpaSqlCustomQuery jpasqlCustomQuery = querydslHelper
                    .query();
    
            jpasqlCustomQuery
                    .from(
                            jpasqlCustomQueryUnion.union(
                                    SQLExpressions
                                            .select(qGoodsUnionOne.goodsNo)
                                            .from(qGoodsUnionOne)
                                            .where(
                                                    qGoodsUnionOne.saleStatCl.in(SaleStatusEnum.SOLDOUT.getCode(), SaleStatusEnum.SALE.getCode())
                                                            .and(qGoodsUnionOne.updDm.after(Expressions.dateTemplate(LocalDateTime.class, "{0}", updateDate)))
                                                            .and(qGoodsUnionOne.usedYn.eq("N"))),
                                    SQLExpressions
                                            .select(qGoodsUnionTwo.goodsNo)
                                            .from(qGoodsUnionTwo)
                                            .join(goodsCouponGtUpdateTime).on(
                                            qGoodsUnionTwo.goodsNo.eq(goodsCouponGtUpdateTime.goodsNo)
                                                    .and(qGoodsUnionTwo.goodsSub.eq(goodsCouponGtUpdateTime.goodsSub))
                                    )
                                            .where(
                                                    qGoodsUnionTwo.saleStatCl.in(SaleStatusEnum.SOLDOUT.getCode(), SaleStatusEnum.SALE.getCode())
                                                            .and(goodsCouponGtUpdateTime.ut.after(Expressions.dateTemplate(LocalDateTime.class, "{0}", updateDate)))
                                                            .and(qGoodsUnionTwo.usedYn.eq("N"))
                                            )
                            ).as("goodsUnionOne")
                    ).join(qGoods)
                    .on(qGoods.goodsNo.eq(qGoodsUnionOne.goodsNo));
    
            getSelectGoodsWhere(jpasqlCustomQuery, updateDate);
            getGoodsColumn(jpasqlCustomQuery);

     

    그리고 실행을 해보았다!! 두근두근두근

    내가 의도한대로 작성이 되었다!!

    너무 기뻐서 물 한모금 꿀꺽 하고 기쁨을 만끽하였다

     

    별거 아니지만 오늘도 공유할 수 있다는 사실이 기쁘다!

     

    댓글 언제나 환영합니다!

    반응형

    댓글

Designed by Tistory.