• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

jpa query creation 을 많은 sub class 에 한번에 적용하는 방법이 있을까요 ?

22.12.13 17:45 작성 22.12.13 17:47 수정 조회수 155

0

안녕하세요.
이번에 드릴 질문이 강의 내용에서 약간 벗어나는 내용일 수도 있을것 같습니다. 그래서 꼭 해주실 필요는 없지만 만약에 답변이 가능하다면 해주신다면 감사하겠습니다.

개인프로젝트 중에 생긴 문제입니다.

목차
1. 문제상황
2. 지금 하고 있는거
3. 질문

  1. 문제 상황

클래스

@MappedSuperClass class Human {  
  @Id
  private string field1;  
  private Long field2;  
  private Type type;
}


@Entity class  Student extends Human{}
@Entity class  Teacher extends Human{}
...

 

레포지토리

@Repository
public interface StudentRepository() implements JpaRepository<Student, String>{
   Page<Student> findByField2LessThanEqual(Long field2, Pageable pageable);
}

@Repository
public interface TeacherRepository() implements JpaRepository<Teacher, String>{
   Page<Student> findByField2LessThanEqual(Long field2, Pageable pageable);
}

이런 관계에서 Human 을 상속받는 클래스가 100개로 늘었다고 가정하겠습니다.
jpa 쿼리 크리에이션을 모든 레포지토리에 적용해야 하는 상황입니다.

  1. 지금 제가 하고 있는것
    제가 지금 하고 있는 방법이 있긴하지만 더 좋은 방법 있을것 같습니다. 추천해주신다면 감사하겠습니다.

public interface PagebleRead{
  Page<Human> findByField2LessThanEqual(Long field2, Pageable pageable);
}

@Repository
public interface StudentRepository() implements JpaRepository<Student, String>, PageableRead{
}

@Repository
public interface TeacherRepository() implements JpaRepository<Teacher, String>, PageableRead{
 
}

이렇게 하면 선언하는데에는 손이 덜 가지만 PageableRead 의 타입으로 JpaRepository 의 함수를 호출 할 수 없습니다.

PageableRead repo = findRepository();
repo.save(Student.builder().build());

이런게 안됩니다. PageableRead 대신에

public interface CommonJpaMethod{
  Page<Human> findByField2LessThanEqual(Long field2, Pageable pageable);
  Human save(Human human);

  // jpa 함수 중 사용할 함수 시그니쳐 선언 ...
}

이렇게 공통인터페이스를 선언하면 기능하긴 하지만 정석적인 방법인지는 모르겠습니다.


3. 결론
모든 서브 클래스에 손을 대지 않으면서 하나의 repository 클래스로 query creation 함수와 jpa 에서 제공하는 기본 함수를 쓸 수 있는 방법이 있을까요?

답변 1

답변을 작성해보세요.

1

안녕하세요. dankim님

JPA 기본편에서 설명하는 상속관계와 @MappedSuperClass의 차이에 대해서 먼저 이해가 필요합니다. 이 부분을 복습해보시면 방향이 잡힐꺼에요.

감사합니다.

dankim님의 프로필

dankim

질문자

2022.12.22

지금 찾아가지고 해결하고 있습니다. : ) 강의 잘보고 있습니다 . 감사합니다