반응형
[JPA] Query Method(쿼리 메소드) 사용 방법
QueryMethod(쿼리메소드)는 JPA에서 검색하는 방법 중 한 가지이다.
public class UserRepositoryTest extends StudyApplicationTests {
@Test
@Transactional
public void read() {
// select * from user where id = ?
Optional<User> user = userRepository.findById(1L);
user.ifPresent(selectUser -> {
// list형태로 상품이 반환됨. list이므로 stream을 통해 forEach를 돌림
selectUser.getOrderDetailList().stream().forEach(detail -> {
Item item = detail.getItem();
System.out.println(detail.getItem()); // ID 1인 사람의 detail에 있는 Item 객체를 출력
});
});
}
}
위의 findById 메소드를 사용한 부분을 쿼리문으로 풀어보면 아래와 같다
select * from user where id = ?
나의 경우는 실제 데이터베이스를 보면서 id=1에 해당하는 데이터가 존재한다는 것을 미리 알고있는 상황이므로 findById(1L)을 사용한 것이다. 하지만 실제로는 id값은 모르는 상태에서, user의 account나 email를 알고 있어야지 조회를 할 수 있다. 이를 UserRepository에 반영해보자.
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// select * from user where account = ?
Optional<User> findByAccount(String account);
Optional<User> findByEmail(String email);
}
findByAccount 부분을 쿼리문으로 작성하면 다음과 같다.
select * from user where account = ?
이제 UserRepositoryTest 코드를 바꿔보자.
public class UserRepositoryTest extends StudyApplicationTests {
@Test
@Transactional
public void read() {
// select * from user where account = ?
Optional<User> user = userRepository.findByAccount("TestUser01");
user.ifPresent(selectUser -> {
// list형태로 상품이 반환됨. list이므로 stream을 통해 forEach를 돌림
selectUser.getOrderDetailList().stream().forEach(detail -> {
Item item = detail.getItem();
System.out.println(detail.getItem()); // ID 1인 사람의 detail에 있는 Item 객체를 출력
});
});
}
}
기존과 달라진 점이라면, findById로 조회하던 것을 findByAccount로 바꾸었다.
여러 가지로 검색하고 싶은 경우에는 아래와 같이 And로 연결하면 된다. 이는 쿼리문에서 and를 사용하는 것과 똑같은 방식이다.
// select * from user where account = ? and email = ?
Optional<User> findByAccountAndEmail(String account, String email);
JPA에서는 findBy까지만 보고 이것이 select문임을 인식한 후, 그 뒤에 오는 문자(Account)를 보고 매칭시킨다. 이것이 JPA에서 쿼리 메소드가 동작하는 원리이다. 마치 쿼리문을 메소드 형태로 작성한다고 해서 쿼리 메소드(Query Method)라고 부른다.
(출처: 패스트캠퍼스 Java & SpringBoot로 시작하는 웹 프로그래밍)
반응형
'Java' 카테고리의 다른 글
[어드민 페이지 만들기] Repository 생성 & JUnit 테스트코드 작성 (0) | 2022.03.03 |
---|---|
[어드민 페이지 만들기] ERD 설계 & Table 생성 & Entity 생성 (0) | 2022.02.27 |
JPA 연관관계 설정 구체적인 방법 (fetch 타입 종류: LAZY, EAGER) (0) | 2022.02.25 |
[JPA] entity와 repository 생성 (+ JUnit Test 실행 방법) (0) | 2022.02.25 |
JPA 연관관계 설정 (@OneToOne/@OneToMany/@ManyToOne/@ManyToMany) (0) | 2022.02.25 |