알이즈웰
[QueryDsl] QueryDsl로 다이나믹쿼리도 만들고~ join도하고~ 본문
온갖 복잡한 쿼리를 지금 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;
}
'Programming > JPA' 카테고리의 다른 글
JPA group by 사용시 유의점 (0) | 2021.11.16 |
---|---|
[Querydsl] case/when문에서 enum class로 조회할 경우 오류 (0) | 2021.08.19 |
Comments