스프링데이터 + JPA/스프링 데이터 JPA

13. 파라미터 바인딩

sdafdq 2023. 11. 20. 12:50

파라미터 바인딩은 위치기반이 있고 이름기반이 있음

select m from Member m where m.username = ?0
select m from Member m where m.usernmae = :name

위치기반은 사용하지 않는다고 함.

확실히 이름기반이 훨씬 명확함.

 

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

이렇게 바인딩 했었음.

@Param(SQL상파라미터명) 타입 인자이름

 

여튼 이런거는 지금까지 많이 해왔던 거고,

 

컬렉션을 인자로 넣을 수 있는데 이게 무슨 말이냐,

SQL문에서 in안에 여러개 넣어서 or로 조회할 수가 있잖아?, 이게 그거다.

 

뭐 사실 이것도 굳이 코드로 구현한다고 하면 

String inParameter= ""

for(int i = 0; i< params.length; i++){
	inParameter += params[i];
    if(i != params.length-1){
    	inParameter += ",";
    }
}

inParameter = "(" + inParameter + ")";

뭐 이런 식으로..

 

이거를 Spring Data Jpa가 자동으로 해 주는 거임.

 

 

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

이렇게

 

Collection 쓴 이유는 알지?

콜렉션 저렇게 상위로 써서 List든 Map이든 콜렉션 하위 다 받을 수 있게 다형성.

 

@Test
public void testCollectionParameter(){
    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"));

    assertThat(result.get(0).getUsername()).isEqualTo("AAA");
    assertThat(result.get(1).getUsername()).isEqualTo("BBB");
}

저렇게 asList해서 "AAA", "BBB" 리스트로 만들어 주고,

 

저거 나가는 쿼리 보면

 

    select
        m1_0.member_id,
        m1_0.age,
        m1_0.team_id,
        m1_0.username 
    from
        member m1_0 
    where
        m1_0.username in (?,?)
        
select m1_0.member_id,m1_0.age,m1_0.team_id,m1_0.username from member m1_0 where m1_0.username in ('AAA','BBB');

이렇게 잘 나감.

 

물론 테스트도 통과임.