JPA - JPQL사용해보기

2024. 10. 2. 21:44·Java & Spring/Spring

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  (1) 2024.10.07
JPA - Querydsl 사용법 및 실습  (0) 2024.10.04
JPA - 쿼리 파일 만들기  (2) 2024.09.27
JPA - 데이터베이스와 SQL  (4) 2024.09.26
테스트코드 작성에 사용되는 메서드 및 애노테이션(1)  (0) 2024.09.23
'Java & Spring/Spring' 카테고리의 다른 글
  • Spring - Spring Security
  • JPA - Querydsl 사용법 및 실습
  • JPA - 쿼리 파일 만들기
  • JPA - 데이터베이스와 SQL
DJ.Kang
DJ.Kang
백엔드 개발 기록 블로그
  • DJ.Kang
    DJ Hello World
    DJ.Kang
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 이론공부 N
        • 자격증 N
        • 개념
      • 시스템설계
      • Java & Spring
        • TIL
        • 트러블슈팅
        • 고도화
        • 알고리즘
        • 코딩테스트
        • Java
        • Spring
        • Thymeleaf
      • 프로젝트
        • coin-trading
        • 트러블슈팅
      • Docker
      • DB
      • AWS
      • CI-CD
      • 웹
      • git & github
      • 구인공고분석
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    java 제어자
    java enhance switch
    개발로드맵
    java 에라토스테네스의 체
    데이터 크기
    java super
    프로그래머스 java 기초 트레이닝
    java two-pointer
    java 유클리드 호제법
    프로그래머스 java 기초트레이닝
    데이터 타입
    java 세수의합
    java 멤버
    Java 생성자
    Java this
    java 메서드
    java arrays.copyofrnage()
    java
    java기초
    자료구조
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
DJ.Kang
JPA - JPQL사용해보기
상단으로

티스토리툴바