FireDrago
[Spring Data JPA] 쿼리 메서드 본문
메소드 이름으로 쿼리 생성
------------------------------스프링 데이터 JPA-------------------------------------
public interface MemberRepository extends JpaRepository<Member, Long> {
List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
}
----------------------------------순수 JPA------------------------------------------
@Repository
@RequiredArgsConstructor
public class MemberJpaRepository {
public List<Member> findByUsernameAndAgeGreaterThan(String username, int age) {
return em.createQuery("select m from Member m where m.username = :username and m.age > :age")
.setParameter("username", username)
.setParameter("age", age)
.getResultList();
}
}
By.... 뒤에 위치한 엔티티 필드명이 where 조건으로 변경되고 And로 조건을 연결할 수 있다.
엔티티의 필드명이 변경되면, 인터페이스의 이름도 꼭 함께 변경해야 한다.
<스프링 데이터 JPA가 제공하는 쿼리 메소드 기능>
- 조회: find…By ,read…By ,query…By get…By,
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.querymethods.query-creation
- 예:) findHelloBy 처럼 ...에 식별하기 위한 내용(설명)이 들어가도 된다.
- COUNT: count…By 반환타입 long
- EXISTS: exists…By 반환타입 boolean
- 삭제: delete…By, remove…By 반환타입 long
- DISTINCT: findDistinct, findMemberDistinctBy
- LIMIT: findFirst3, findFirst, findTop, findTop3
JPA NamedQuery
------------------------엔티티에 @NamedQuery 설정------------------------------------
@Entity
@NamedQuery(
name="Member.findByUsername",
query="select m from Member m where m.username = :username")
public class Member {
...
}
------------------------스프링 데이터 JPA로 NamedQuery 사용----------------------------
@Query(name = "Member.findByUsername")
List<Member> findByUsername(@Param("username") String username);
// @Query 생략하면, "도메인 클래스.메서드 이름" 으로 NamedQuery를 찾아서 실행한다.
List<Member> findByUsername(@Param("username") String username);
@Query, 리포지토리 메소드에 쿼리 정의하기
public interface MemberRepository extends JpaRepository<Member, Long> {
// 실무에서는 메소드 이름으로 쿼리 생성 기능은 파라미터가 증가하면 메서드 이름이 매우 지저분해진다.
// 따라서 @Query 기능을 자주 사용하게 된다.
@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);
}
@Query 어노테이션을 사용하면, 애플리케이션 실행시점에 문법 오류를 발견할 수 있다.
@Query, 값, DTO 조회하기
public interface MemberRepository extends JpaRepository<Member, Long> {
// 값을 조회
@Query("select m.username from Member m")
List<String> findUsernameList();
// DTO로 조회하기 new 사용해야한다
@Query("select new study.datajpa.dto.MemberDto(m.id, m.username, t.name) " +
"from Member m join m.team t")
List<MemberDto> findMemberDto();
}
반환타입
List<Member> findByUsername(String name); //컬렉션
Member findByUsername(String name); //단건
Optional<Member> findByUsername(String name); //단건 Optional
스프링 데이터 JPA는 여러타입의 반환타입을 지원한다.
조회 결과가 많을때는 컬렉션
단건조회시에는 Optional, Member(엔티티) 엔티티 단건조회시 결과가 없다면 null을 반환한다.
JPA는 결과가 없으면 NoResultException 예외를 발생시키지만, 스프링 데이터 JPA는 예외를 무시하고 null을 반환한다.
