Spring Data JPA - Query 를 이용한 조회 결과를 특정 값으로 반환하기

목차

@Query 를 이용한 조회 결과를 특정 값으로 반환하기

DB로 부터 조회한 결과에서 객체의 특정 값만 가져오고 싶은 경우 객체에서 feild값을 조회 하듯이 객체.field 형식으로 명시해주면 해당 값을 가져올 수 있다. 반환 형식으로는 해당 field의 데이터 형식에 맞춰주면 된다.

@Query("select m.username from Member m")
List<String> findUsernameList();
public interface MemberRepository extends JpaRepository<Member, Long> {
List<Member> findByUsernameAndAgeGreaterThan(String username, int age);

@Query("select m from Member m where m.username = :username and m.age = :age")
List<Member> findUser(@Param("username") String username, @Param("age") int age);

@Query("select m.username from Member m")
List<String> findUsernameList();
}
@Test
public void findUsernameList() {
Member m1 = new Member("AAA", 10);
Member m2 = new Member("BBB", 20);
memberRepository.save(m1);
memberRepository.save(m2);

List<String> memberNames = memberRepository.findUsernameList();
for (String name : memberNames) {
System.out.println("Username : " + name);
}
}

DTO를 사용해 @Query 작성하기

일반적으로 DB에서 데이터를 조회할 때 Entity 모든 값보다는 필요한 값 몇가지만을 가져오는 경우가 많다. 이렇게 필요한 데이터 만을 가져올 수 있도록 DTO class를 정의하고 DTO를 이용해 Entity에서 필요한 데이터만을 조회하는 방법이 더 효율적으로 데이터를 가져오는 방식이다. DTO를 이용해 해당 Entity에서 필요한 데이터만을 조회할 수 있도록 구현해보자!

@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;
}
}

@Query에서 DTO를 사용하기 위해서는 Select절에 패키지를 포함한 Class 경로를 명시해줘야 한다.

// DTO 로 결과 값 반환 받기
@Query("select new com.example.datajpa.dto.MemberDto( m.id, m.username, t.name)from Member m join m.team t")
List<MemberDto> findMemberByDto();

반환 값 확인하기

@Test
public void findMemberDto(){
Team team = new Team("teamA");
teamRepository.save(team);

Member member = new Member("AAA", 10);
member.setTeam(team);
memberRepository.save(member);

// Dto로 결과 값을 반환 받는다.
List<MemberDto> memberDto = memberRepository.findMemberByDto();
for(MemberDto dto : memberDto){
System.out.println("dto : " + dto);
}
}
Share