Dtype의 종류에 따라 쿼리 조건을 다르게 넣고 싶습니다.
@Inheritance(strategy = InheritanceType.JOINED)
public List<Todo> getTodoByPlanIdAndDate_Regular(Plan plan, LocalDate date) {
if (plan.getDtype() == "regular") {
/*regular일 경우 startDate 조건만 걸기*/
return em.createQuery("select o from Todo o where o.plan.dtype = :dtype and o.plan.id =:planId and o.plan.startDate <= :date")
.setParameter("date", date)
.setParameter("planId", plan.getId())
.setParameter("dtype", plan.getDtype())
.getResultList();
}
else {
/*term일 경우 startDate, endDate 조건 둘 다 걸기*/
return em.createQuery("select o from Todo o where o.plan.dtype = :dtype and o.plan.id =:planId and o.plan.startDate <= :date and o.plan.endDate >= :date")
.setParameter("date", date)
.setParameter("planId", plan.getId())
.setParameter("dtype", plan.getDtype())
.getResultList();
}
}
코드로 표현하면 이런 식이 될 것 같습니다.
그런데 문제는 regular일 때 조건은 잘 걸리는데 term일 때 조건이 안 걸린다는 것입니다.
endDate를 resolve할 수 없다고 뜹니다. 저 코드에서는 o.plan.endDate로 조건을 걸었는데 부모인 Plan에는 endDate가 없어서 그런 것 같습니다.
Todo의 연관관계는 부모인 Plan으로 걸려 있기 때문에 자식인 PlanRegular나 PlanTerm으로 조회할 수도 없습니다.
이 문제를 해결하기 위해 Todo도 regular와 term으로 분리하고 모든 Todo 관련 메서드를 regular와 term을 따로 처리하도록 하는...그런 방법을 생각해 봤습니다.
하지만 중복되는 코드가 너무 많아지기도 하고
Plan과 다르게 Todo는 regular와 term이 다르게 가지고 있는 변수가 없어서(Plan의 endDate처럼) 상속을 적용하기는 적합하지 않을 것 같습니다.
이 문제를 해결할 수 있는 방법이 있을까요?
Câu trả lời 1
0
자문자답입니다. 계속 구글링한 결과 찾았습니다^^... treat를 써서 엔티티를 다운캐스팅하면 되는 거였습니다. 더 좋은 방법이 있을지도 모르겠습니다만...
return em.createQuery("select o from Todo o join o.plan p where p.id =:planId and treat(p as PlanTerm).startDate <= :date and treat(p as PlanTerm).endDate >= :date")
.setParameter("date", date)
.setParameter("planId", plan.getId())
.getResultList();
아직 이 jpa 기본편을 끝까지 듣지 못해서 몰랐는데 이 강의 마지막쯤 객체지향 쿼리 언어 파트에도 나오네요.
역시 김영한님 강의입니다. 프로젝트를 하면서 들을 게 아니라 다 듣고 나서 프로젝트를 했어야 하나 봅니다. 혹시 참고할 사람이 있을지도 몰라서 글은 남겨놓겠습니다.
실무 조언 관련 질문입니다.
0
38
1
H2데이터베이스 파일 생성
0
45
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
47
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
45
1
JPQL 메소드와 락
0
48
1
Delivery @OneToOne
0
54
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
85
2
UnsupportedOperationException 발생
0
80
3
H2 Database 연결이 안됩니다.
0
87
2
연관관계 매핑 질문드립니다.
0
77
2
h2데이터베이스 실행오류
0
103
2
persistence.xml
0
101
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
75
1
영속성 컨텍스트
0
60
1
JPA 프록시
0
87
1
Native Query와 MyBatis
0
61
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
81
1
임베디드 타입 예시 코드 관련 질문
0
110
3
명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요
0
89
3
인텔리제이 패키지 커서 단축키 질문
0
101
2
혹시 현재는 ID 데이터 타입이 String이면 안되나요?
0
134
1
양방향 연관관계 시 연관관계 주인을 설정하는 이유
0
67
1
임베디드 타입과 MappedSuperClass의 차이점이 궁금합니다.
0
95
1
데이터베이스가 초기화되는 것 같아요
1
172
2

