spring data jpa : parameter binding, result type

This commit is contained in:
haerong22
2021-09-01 00:30:56 +09:00
parent 5314613c8c
commit cbb91d32cb
2 changed files with 61 additions and 3 deletions

View File

@@ -6,7 +6,9 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
public interface MemberRepository extends JpaRepository<Member, Long> {
@@ -23,4 +25,11 @@ public interface MemberRepository extends JpaRepository<Member, Long> {
@Query("select new com.example.springdatajpa.dto.MemberDto(m.id, m.username, t.name) from Member m join m.team t")
List<MemberDto> findMemberDto();
@Query("select m from Member m where m.username in :names")
List<Member> findByNames(@Param("names") Collection<String> names);
List<Member> findListByUsername(String username); // 컬렉션
Member findMemberByUsername(String username); // 단건
Optional<Member> findOptionalByUsername(String username); // Optional
}

View File

@@ -6,20 +6,25 @@ import com.example.springdatajpa.entity.Team;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.test.annotation.Rollback;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
@Transactional
@Rollback(value = false)
public class MemberRepositoryTest {
@Autowired MemberRepository memberRepository;
@Autowired TeamRepository teamRepository;
@Autowired
MemberRepository memberRepository;
@Autowired
TeamRepository teamRepository;
@Test
void testMember() {
@@ -130,4 +135,48 @@ public class MemberRepositoryTest {
assertEquals("aaa", result.get(0).getUsername());
assertEquals("teamA", result.get(0).getTeamName());
}
@Test
public void findByNames() {
Member m1 = new Member("aaa", 10);
Member m2 = new Member("bbb", 20);
memberRepository.save(m1);
memberRepository.save(m2);
List<Member> result = memberRepository.findByNames(Arrays.asList("aaa", "bbb"));
for (Member member : result) {
System.out.println("member = " + member);
}
}
@Test
public void returnType() {
Member m1 = new Member("aaa", 10);
Member m2 = new Member("bbb", 20);
Member m3 = new Member("ddd", 20);
Member m4 = new Member("ddd", 20);
memberRepository.save(m1);
memberRepository.save(m2);
memberRepository.save(m3);
memberRepository.save(m4);
List<Member> memberList = memberRepository.findListByUsername("aaa");
Member member = memberRepository.findMemberByUsername("aaa");
Optional<Member> optionalMember = memberRepository.findOptionalByUsername("ccc");
assertEquals(1, memberList.size());
assertEquals(m1, member);
assertTrue(optionalMember.isEmpty());
List<Member> resultList = memberRepository.findListByUsername("ccc");
Member result = memberRepository.findMemberByUsername("ccc");
assertEquals(0, resultList.size()); // 조회 데이터가 없을 경우 빈 리스트 리턴
assertNull(result); // 조회 데이터가 없을 경우 exception 발생 X -> spring data jpa 가 예외처리 하여 null 리턴
assertThrows(IncorrectResultSizeDataAccessException.class,
() -> memberRepository.findOptionalByUsername("ddd")); // 반환 타입은 단건 인데 여러 건이 조회 되었을 경우 예외 발생
}
}