파라미터 바인딩은 위치기반이 있고 이름기반이 있음
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');
이렇게 잘 나감.
물론 테스트도 통과임.
'스프링데이터 + JPA > 스프링 데이터 JPA' 카테고리의 다른 글
15. 순수 JPA 페이징, 정렬 (0) | 2023.11.21 |
---|---|
14. 스프링 데이터 JPA 반환 타입 (0) | 2023.11.21 |
12. Dto나 테이블 중 특정 값만 조회해 오기 (0) | 2023.11.20 |
11. @Query, 메소드에 쿼리 정의 (0) | 2023.11.20 |
10. JPA 네임드 쿼리 (0) | 2023.11.20 |