package stduy.datajpa.entity;
import lombok.*;
import javax.persistence.*;
@Entity
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(of = {"id", "username", "age"})
@NamedQuery(
name="Member.findByUsername",
query="select m from Member m where m.username = :username"
)
public class Member {
@Id
@GeneratedValue
@Column(name = "member_id")
private Long id;
private String username;
private int age;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "team_id")
private Team team;
public Member(String name) {
this.username = name;
}
public Member(String name, int age, Team team) {
this.username = name;
this.age = age;
if (team != null) {
changeTeam(team);
}
}
public Member(String name, int age) {
this.username = name;
this.age = age;
}
public void changeTeam(Team team) {
this.team = team;
team.getMembers().add(this);
}
}
package stduy.datajpa.entity;
import lombok.*;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(of = {"id", "name"})
public class Team {
@Id
@GeneratedValue
@Column(name = "team_id")
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
public Team(String name) {
this.name = name;
}
}
package stduy.datajpa.dto;
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;
}
}
public interface MemberRepository extends JpaRepository<Member, Long> {
@Query("select new stduy.datajpa.dto.MemberDto(m.id,m.username, t.name) from Member m join m .team t")
List<MemberDto> findMemberDto();
}
Member와 Team을 join하여 레코드값을 받아온 후
new MemberDto - > MemberDto를 생성한후 생성자 메소드에 레코드 값들을 넣어서
List<MebmerDto>로 반환한다.
테스트 코드
@SpringBootTest
@Transactional
@Rollback(value = false)
class MemberRepositoryTest {
@Autowired
MemberRepository memberRepository;
@Autowired
TeamRepository teamRepository;
@Test
public void findMemberDto() {
Member m1 = new Member("AAA", 10);
memberRepository.save(m1);
Team team = new Team("TeamA");
m1.setTeam(team);
teamRepository.save(team);
List<MemberDto> memberDto = memberRepository.findMemberDto();
for (MemberDto dto : memberDto) {
System.out.println("dto = " + dto);
}
}
}