이번 포스팅에서는 SpringDataJPA를 이용해서 엔티티 타입이 아닌 단순한 값이나 DTO를 어떻게 조회하는지 알아보고자 한다.
// 사용자 이름 list 조회
@Query("select m.username from Member m")
List<String> findUsernameList();
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);