SpringDataJPA - @Query, 값, DTO 조회하기

박민수·2023년 11월 14일
0

JPA

목록 보기
14/24
post-thumbnail

@Query, 값, DTO 조회하기

이번 포스팅에서는 SpringDataJPA를 이용해서 엔티티 타입이 아닌 단순한 값이나 DTO를 어떻게 조회하는지 알아보고자 한다.

단순한 값 조회

// 사용자 이름 list 조회
@Query("select m.username from Member m")
List<String> findUsernameList();

DTO 조회

DTO로 직접 조회 하려면 JPA의 new 명령어를 사용해야 한다.

@Query("select new study.datajpa.dto.MemberDto(m.id, m.username, t.name) " +
	"from Member m join m.team t")
List<MemberDto> findMemberDto();

다음과 같이 생성자가 맞는 DTO가 필요하다. (JPA와 사용방식이 동일하다.)

package study.datajpa.repository;

import lombok.Data;

@Data
public class MemberDto {
    private Long id;
    private String username;
    private String teamName;
    
    public MemberDto(Long id, String username, String teamName) {
        this.id = id;
        this.username = username;
        this.teamName = teamName;
    }
}

파라미터 바인딩

파라미터 바인딩에는 위치 기반과, 이름 기반 2가지가 있는데 위치 기반은 거의 사용하지 않는다. 위치 기반은 위치가 바껴버리면 버그가 발생할 수 있다. 코드 가독성과 유지보수를 위해 이름 기반 파라미터 바인딩을 사용하는 것을 권장한다.

select m from Member m where m.username = ?0 //위치 기반
select m from Member m where m.username = :name //이름 기반
import org.springframework.data.repository.query.Param

public interface MemberRepository extends JpaRepository<Member, Long> {
    @Query("select m from Member m where m.username = :name")
    Member findMembers(@Param("name") String username);
}

컬렉션 파라미터 바인딩

파라미터에 Collection 타입을 넣으면 in 절에 자동으로 바인딩 된다..

@Query("select m from Member m where m.username in :names")
List<Member> findByNames(@Param("names") List<String> names);

참조
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-JPA-%EC%8B%A4%EC%A0%84/dashboard

profile
안녕하세요 백엔드 개발자입니다.

0개의 댓글