알이즈웰

[QueryDsl] QueryDsl로 다이나믹쿼리도 만들고~ join도하고~ 본문

Programming/JPA

[QueryDsl] QueryDsl로 다이나믹쿼리도 만들고~ join도하고~

2021. 8. 4. 00:10

온갖 복잡한 쿼리를 지금 QueryDsl로 만들 생각에 들뜬다..

내가 이것저것 마구마구 조합했는데 모두 실패했던게 다른 팀 프로젝트에서 예쁘게 잘쓰고 있었따..

참고 잘 했습니당.. 감사합니당!

(기록용으로 메모해두면서 + 나와 같은 고민을 하는 사람들이 있을까 싶어 공개 포스팅으로 한다.)

 

< 내 삽질과 예쁘게 잘 짜여있는 코드간의 차이점 >
1. 나는 구현 class에 @Repository 붙히지않았었음
2. 쿼리 짜는 방법
  - 나는 무조건 JPAQuery나 JPAQueryFactory를 쓰려고 했는데 그러지 않아도 그냥 from 부터 시작해도 됐었음...
3. 생성자 인수 삭제하지않고 고대애로 뒀었음
  - 이것도 되어있는대로만 뒀지.. 뭐가 잘못됐는지 생각해보질 않음..
4. 생성자 super 메소드 설정 시 class 지정하지 않았었음

 

수정 버전

@Repository
public class AppleSlaveRepositoryImpl extends FruitQuerydslRepositorySupport implements FruitRepositoryCustom {

    QAppleEntity appleEntity = QAppleEntity.appleEntity;
    QBananaEntity bananaEntity = QBananaEntity.bananaEntity;

    //public AppleSlaveRepositoryImpl(Class<?> domainClass) {
    //    super(domainClass);
    //}

    public AppleSlaveRepositoryImpl() {
        super(AppleEntity.class);
    }
    
    @Override
    public List<AppleEntity> getTotalList(String startMonth, String endMonth, Integer id) {
    
        List<AppleEntity> result = from(appleEntity)
            .leftJoin(bananaEntity)
            .on(appleEntity.refDate.eq(bananaEntity.date).and(appleEntity.id.eq(bananaEntity.id)))
            .where(eqDate(startMonth, endMonth),
            eqId(id))
            .fetch();
        
        return result;

    }
    
}

 

잘못 짠 코드

//QuerydslRepositorySupport를 상속받은 class에 만들었던 메서드
public List<AppleEntity> getMonthlyList(@Param("startDate") String startDate, @Param("endDate") String endDate) {

  List<AppleEntity> result;

  QAppleEntity appleEntity = QAppleEntity.appleEntity;
  QBananaEntity bananaEntity = QBananaEntity.bananaEntity;

  //JPAQuery로 생성한 객체가 null이 나오고 있음
  //        result = new JPAQuery<AppleEntity>(getEntityManager()).from(appleEntity)
  //            .leftJoin(bananaEntity).fetchJoin()
  //            .where(appleEntity.refDate.between(startDate, endDate))
  //            .fetch();

  //역시나 null
  result = queryFactory()
    .selectFrom(appleEntity)
    .fetch();

  return result;
  
}
Comments