JPQL(Java Persistence Query Language) 이란?
JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다.
따라서 테이블을 대상으로 쿼리 하는 것이 아닌 엔티티 객체를 대상으로 쿼리한다.
JPQL은 SQL을 추상화했기 때문에 특정 데이터베이스 SQL에 의존하지 않는 장점이 있다.
JPQL은 SQL과 문법이 유사하며, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN을 지원한다.
- 실습
◇ Controller
@GetMapping("/todos")
public ResponseEntity<Page<TodoResponse>> getTodos(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size,
) {
return ResponseEntity.ok(todoService.getTodos(page, size));
}
위 코드에 검색 조건 추가하기
@GetMapping("/todos")
public ResponseEntity<Page<TodoResponse>> getTodos(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size,
@RequestParam(required = false) String weather,
@RequestParam(required = false) LocalDateTime modifiedAtStart,
@RequestParam(required = false) LocalDateTime modifiedAtEnd
) {
return ResponseEntity.ok(todoService.getTodos(page, size, weather, modifiedAtStart, modifiedAtEnd));
}
- @RequestParam으로 조건값을 입력받는다.
- (required = false)로 두어 필수입력이 아니게 한다.
- 입력안될경우 매개변수로 서비스단에 null이 전달된다.
◇ Service
public Page<TodoResponse> getTodos(int page, int size, String weather, LocalDateTime modifiedAtStart, LocalDateTime modifiedAtEnd) {
Pageable pageable = PageRequest.of(page - 1, size);
// weather 조건이 있는경우
if (weather != null) {
return todoRepository.findByWeather(weather, pageable).map(this::createResponse);
}
// 둘 다 입력한경우
if (modifiedAtStart != null && modifiedAtEnd != null) {
return todoRepository.findByModifiedAtBetween(modifiedAtStart, modifiedAtEnd, pageable).map(this::createResponse);
}
// 기간 시작부분만 입력한 경우
if (modifiedAtStart != null) {
return todoRepository.findByModifiedAtAfter(modifiedAtStart, pageable).map(this::createResponse);
}
// 기간 끝부분만 입력한 경우
if (modifiedAtEnd != null) {
return todoRepository.findByModifiedAtBefore(modifiedAtEnd, pageable).map(this::createResponse);
}
Page<Todo> todos = todoRepository.findAllByOrderByModifiedAtDesc(pageable);
return todos.map(this::createResponse);
}
public TodoResponse createResponse(Todo todo) {
return new TodoResponse(
todo.getId(),
todo.getTitle(),
todo.getContents(),
todo.getWeather(),
new UserResponse(todo.getUser().getId(), todo.getUser().getEmail()),
todo.getCreatedAt(),
todo.getModifiedAt()
);
}
- 조건문을 통해서 Param값이 입력된 경우 쿼레매서드 실행
- 조회된 값을 .map을 통해 dto객체로 변환하여 반환
- .map(this::createResponse)는 TodoResponse todoResponse = new TodoResponse(todo); 와 같은의미
◇ Repository
public interface TodoRepository extends JpaRepository<Todo, Long> {
@Query("SELECT t FROM Todo t LEFT JOIN FETCH t.user u ORDER BY t.modifiedAt DESC")
Page<Todo> findAllByOrderByModifiedAtDesc(Pageable pageable);
@Query("SELECT t FROM Todo t WHERE t.weather = :weather")
Page<Todo> findByWeather(@Param("weather") String weather, Pageable pageable);
@Query("SELECT t FROM Todo t WHERE t.modifiedAt >= :modifiedAtStart")
Page<Todo> findByModifiedAtAfter(@Param("modifiedAtStart") LocalDateTime modifiedAtStart, Pageable pageable);
@Query("SELECT t FROM Todo t WHERE t.modifiedAt <= :modifiedAtEnd")
Page<Todo> findByModifiedAtBefore(@Param("modifiedAtEnd") LocalDateTime modifiedAtEnd, Pageable pageable);
@Query("SELECT t FROM Todo t WHERE t.modifiedAt BETWEEN :modifiedAtStart AND :modifiedAtEnd")
Page<Todo> findByModifiedAtBetween(@Param("modifiedAtStart") LocalDateTime modifiedAtStart, @Param("modifiedAtEnd") LocalDateTime modifiedAtEnd, Pageable pageable);
}
- @Query를 통해 쿼리문 작성
'Java & Spring > Spring' 카테고리의 다른 글
Spring - Spring Security (0) | 2024.10.07 |
---|---|
JPA - Querydsl 사용법 및 실습 (0) | 2024.10.04 |
JPA - 쿼리 파일 만들기 (1) | 2024.09.27 |
JPA - 데이터베이스와 SQL (3) | 2024.09.26 |
테스트코드 작성에 사용되는 메서드 및 애노테이션(1) (0) | 2024.09.23 |