Study/spring

[Java] Spring Boot Jpa findBy 단일, 여러개 조건 검색 사용법

 

Spring Data Jpa 쿼리 메소드란?

Spring-data-jpa의 JpaRepository는 메소드 이름 규칙에 따라 쿼리를 만들어주는 기능이 있습니다.

쿼리 메소드 기능을 사용해서 AND 조건, OR 조건 등 여러 조건을 사용해서 쿼리를 생성할 수 있습니다.

Spring Data Jpa Query 메소드 공식 문서 바로가기

 

JPA Query Methods :: Spring Data JPA

As of Spring Data JPA release 1.4, we support the usage of restricted SpEL template expressions in manually defined queries that are defined with @Query. Upon the query being run, these expressions are evaluated against a predefined set of variables. Sprin

docs.spring.io

 

 

Entity, 데이터 준비

예시로 사용할 엔티티입니다.

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Getter;

@Entity
@Getter
public class TestEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    private Long id;

    @Column(length = 20)
    private String name;

    private Integer code;

    private LocalDate date;

}

 

데이터는 이렇게 넣겠습니다.

insert into test_entity(code, date, name) 
values 
(1000, '2024-01-01', 'name1'),
(2000, '2024-02-01', 'name2'),
(3000, '2024-03-01', 'name3'),
(4000, '2024-04-01', 'name4'),
(5000, '2024-05-01', 'name5');

데이터 준비 완료
데이터 준비 완료

데이터 준비가 완료되었습니다.

 

 

 

 

Spring Data Jpa 쿼리 메소드 기본 사용법

Spring Data JPA의 쿼리 메소드는 메소드 이름을 기반으로 쿼리를 자동으로 생성합니다.

다음과 같이 JpaRepository를 상속받은 인터페이스에서 메소드를 정의할 수 있습니다:

import java.time.LocalDate;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;

public interface TestRepository extends JpaRepository<TestEntity, Long> {

    // 단일 검색
    List<TestEntity> findByName(String name);

    // 여러 조건 검색(AND)
    List<TestEntity> findByNameAndCode(String name, Integer code);

    // 여러 조건 검색(OR)
    List<TestEntity> findByNameOrCodeOrDate(String name, Integer code, LocalDate date);
}

 

findBy + 컬럼명을 사용하면 컬럼명과 일치하는 데이터를 찾는 조건을 추가합니다.

조건을 여러개 사용하고 싶다면 AND나 OR로 연결해서 사용하면 됩니다.

 

쿼리는 다음과 같이 생성됩니다.

// 단일 검색 findByName(String name)
select te1_0.id,te1_0.code,te1_0.date,te1_0.name from test_entity te1_0 where te1_0.name=?

// AND 다중 검색 findByNameAndCode(String name, Integer code)
select te1_0.id,te1_0.code,te1_0.date,te1_0.name from test_entity te1_0 where te1_0.name=? and te1_0.code=?

// OR 다중 검색
select te1_0.id,te1_0.code,te1_0.date,te1_0.name from test_entity te1_0 where te1_0.name=? or te1_0.code=? or te1_0.date=?

 

 

Spring Data Jpa 조건 사용 예제

LIKE 조건 사용

List<TestEntity> findByNameContaining(String name);​

name 컬럼에 특정 문자열이 포함된 엔티티를 검색합니다.

SQL 쿼리로는 WHERE name LIKE %name%와 같습니다.

 

BETWEEN 조건 사용

List<TestEntity> findByDateBetween(LocalDate startDate, LocalDate endDate);​

특정 날짜 범위 내에 있는 엔티티를 검색합니다.

SQL 쿼리로는 WHERE date BETWEEN startDate AND endDate와 같습니다.

 

정렬 조건 사용

List<TestEntity> findByNameOrderByCodeDesc(String name);​

name 컬럼이 일치하는 엔티티를 code 컬럼을 기준으로 내림차순 정렬하여 검색합니다.

 

페이징 사용

Spring Data JPA는 페이징 기능도 지원합니다.

페이징과 정렬을 사용하려면 Pageable 인터페이스를 메소드 인수로 추가합니다.

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

public interface TestRepository extends JpaRepository<TestEntity, Long> {

    Page<TestEntity> findByName(String name, Pageable pageable);
}

이 메소드는 name 컬럼이 일치하는 결과를 페이징 처리하여 반환합니다.

 

 

읽으면 좋은 글

[Java] Spring Jpa Repository 메소드 명명규칙 정리

 

[Java] Spring Jpa Repository 메소드 명명규칙 정리

Jpa Repository를 상속받은 인터페이스에서 findByXXX 형태로 메소드를 만들면 JPA에 의해 WHERE 절이 추가되었습니다.그 외에도 다양한 조건을 사용할 수 있는데, 어떤 조건들을 사용할 수 있는지 정리

priming.tistory.com