-
[Spring] JPARepository에서 Entity join 방법 및 대상 Entity가 아닌 다른 Entity를 반환해야 할 때Backend/Spring 2022. 10. 6. 23:26728x90
JPARepository
spring boot JPARepository를 사용하면 Repository를 따로 구현하지 않아도 기본적인 함수는 바로 사용이 가능하고, 조회의 경우 함수명 규칙만 잘 맞추면 함수를 구현하지 않아도 사용이 가능하다. 이때 함수명 규칙으로 불가능한 복잡한 쿼리의 경우 @Query 애노테이션을 사용하여 해결할 수 있다.
Entity Relation
@Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_id") private Long id; ... }
@Entity public class Organization { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "organization_id") private Long id; ... }
@Entity public class MemberOrganization { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_organization_id") private Long id; @ManyToOne @JoinColumn(name = "member_id") private Member member; @ManyToOne @JoinColumn(name = "organization_id") private Organization organization; }
- Member, Organization, MemberOrganization 3가지 Entity로 구성되어있다.
- MemberOrganization의 경우 Member, Organization 각각의 테이블과 다대일 관계를 가진다.
- 이때 MemberOrganization 테이블에서 특정 member_id를 가지는 Organization 객체들을 구하려고 한다.
Query 작성
@Query 애노테이션을 통해 Query문으로 애노테이션이 적용된 함수를 실행할 수 있다. 쿼리문에 필요한 변수의 경우 메소드 매개변수에서 @Param 애노테이션을 통해 정의할 수 있다. 쿼리문에서 사용한 변수명과 @Param에 정의한 변수명을 일치시켜야 한다.
중요한 점은 Query문은 SQL문이 아니라 Entity명과 Entity 필드명을 사용하여 작성한다. 만약 실제 sql 쿼리를 사용하고 싶다면 nativeQuery=true 옵션을 통해 네이티브 쿼리 사용을 명시하고 실제 쿼리를 작성하면 된다.
하지만 nativeQuery의 경우 동적정렬을 지원하지 않는다. 필요하다면 countQuery를 추가적으로 작성하면 된다.
public interface MemberOrganizationRepository extends JpaRepository<MemberOrganization, Long> { @Query(value = "select o.organization_id as id, o.name as name from member_organization mg left join organization o on mg.organization_id = o.organization_id where mg.member_id = :memberId", nativeQuery = true ) List<Object[]> findAllByMemberId(@Param("memberId") Long memberId); }
- 만약 MemberOrganization 객체를 반환하는 것이 아니고 위의 쿼리에서 처럼 몇 개의 필드를 지정한다면 Object[] 로 반환 받을 수 있다.
- 선택된 필드들이 Organization 필드여서 Organization 객체로 반환받을 수 있나 했지만 무조건 Object로 반환되는 듯 싶다.
- 따라서 이 값을 다시 다른 객체에 옮기려면 형변환이 필수,,,
728x90'Backend > Spring' 카테고리의 다른 글