본문 바로가기

Spring Data JPA

3월 21일 SpringDataJPA 리포지토리에 메소드 구현

@Query 리포지토리 메소드 구현하기(정적쿼리)

Repository에 JPQL바로 구현하기

 

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

 

이 방법은 JPQL을 바로쓰고 이름도 간결하게 쓸 수 있다.

JPQL에 오타가 있으면 애플리케이션 코딩시점에 오류를 반환한다.

@Query에 JPQL을 바로 넣어서 해당 메소드 실행시 같이 실행시킬 수 있다.

 

Query값 DTO 조회하기 ( 실무에서 많이사용)

1.Stirng / Int로 받아오는 경우

@Query("select m.username from Member m")

List<String> findUsernameList();

//제네릭 타입을 사용해 반환받을 타입을 선택

 

2.DTO로 받기

-DTO 만들기

@Data

public class MemberDto{

private Long id;

private String username;

private String teamName;

}

 

@Query("select new package~MemberDto(m.id , m.username , t.name) from Member m Join m.team t")

//Select 에 Projection에 DTO 의 패키지명을 기재한다.

List<MemberDto> findMemberDto()

//제네릭으로 받을 DTO타입을 지정

 

파라미터 바인딩

이름기반 , 위치기반 , 이름기반을 주로 사용한다.

Select m from Member m where m.username = ?0 위치기반

Select m from Member m where m.username = :name 이름기반

 

@Qeury("select m from Member m where m.username = :name")

Member findMembers(@Param ("name") String username);

//이름 값을 @Param으로 받는다

 

컬렉션 파라미터 바인딩 (실무에서 많이사용 IN응용)

@Query("select m from Member m where m.username in :names")

//in 절로 파라미터를 받는다.

List<Member> findByNames(@Param("names") Collection<String> names);

 

호출시

List<Member> result = memberRepository.findByNames(Arrays.asList("AA" , "BB"))

//매개변수로 Collection <String> 타입의 데이터를 받아와 IN절에 넣고 실행한다.