Jpa Query Method

devyunie·2024년 9월 4일

SpringBoot

목록 보기
13/13
post-thumbnail

Query

Query Method

Repository의 메서드 선언시에 지정된 패턴에 따라 메서드명을 작성하면 JPA가 SQL을 만들어주는 방법

findBy

  • 필드명을 기준으로 모든 컬럼을 조회할 때 사용
  • findBy 뒤에 필드명을 붙여서 작성
  • 필드명의 첫글자는 대문자이어야함
List<SampleUserEntity> findByName(String name);
SampleUserEntity findByTelNumber(String telNumber);
  • And/Or : and 연산 혹은 or 연산에 사용됨, 필드와 필드 사이에 사용
  • ⚠️ And/Or의 우선순위 주의
List<SampleUserEntity> findByNameAndAddress(String name, String address);

Like, NotLike, StartingWith, EndingWith, Containing

  • Like 연산에 대하여 사용, 필드 뒤에 사용
List<SampleUserEntity> findByAddressContaining(String address);

OrderBy

  • 정렬을 사용할 필드를 지정하여 Desc, Asc 지정
List<SampleUserEntity> findByNameOrderByTelNumberDesc(String name);

existsBy

  • 조건에 해당하는 레코드가 존재하는지 여부 확인 시 사용
boolean existsByName(String name);

countBy

  • 조건에 해당하는 레코드의 개수 확인 시 사용
int countByName(String name);

@Query

쿼리 메서드명으로만 쿼리를 생성하는 것이 한계가 있을 때나, 복잡한 쿼리를 작성해야 할 때 사용하는 어노테이션

  • 쿼리 메서드의 한계를 극복하기위해 사용하는 방식
  • 쿼리 메서드가 사용할 수 없는 복잡한 쿼리를 직접 작성하는 방법

JPQL (Java Persistence Query Language)

  • 표준 SQL과 매우 흡사하지만 Entity 클래스와 Entity 필드로 쿼리를 작성하는 방법
@Query(value="SELECT u FROM user u WHERE u.name = ?1 AND u.address = ?2")
List<SampleUserEntity> getJpql(String name, String address);

@Query(value="SELECT u FROM user u WHERE u.name = :name AND u.address = :address")
List<SampleUserEntity> getJpql2(
    @Param("name") String name, 
    @Param("address") String address
);

Native SQL:

  • 현재 RDBMS의 SQL 문법을 그대로 사용하는 방법
  • @Query nativeQuery 속성을 반드시 true로 지정
@Query(value=
"SELECT * " +
"FROM sample_user " + 
"WHERE name = :name " + 
"AND address = :address"
, nativeQuery=true)
List<SampleUserEntity> getNativeSql(
    @Param("name") String name,
    @Param("address") String address
);

Repository

전체코드

경로 base > repository > SampleUserRepository.java

@Repository
public interface SampleUserRepository 
extends JpaRepository<SampleUserEntity, String> {
    
    List<SampleUserEntity> findByName(String name);
    SampleUserEntity findByTelNumber(String telNumber);

    List<SampleUserEntity> findByNameAndAddress(String name, String address);

    List<SampleUserEntity> findByAddressContaining(String address);

    List<SampleUserEntity> findByNameOrderByTelNumberDesc(String name);

    boolean existsByName(String name);

    int countByName(String name);

    @Query(value="SELECT u FROM user u WHERE u.name = ?1 AND u.address = ?2")
    List<SampleUserEntity> getJpql(String name, String address);

    @Query(value="SELECT u FROM user u WHERE u.name = :name AND u.address = :address")
    List<SampleUserEntity> getJpql2(
        @Param("name") String name, 
        @Param("address") String address
    );

    @Query(value=
    "SELECT * " +
    "FROM sample_user " + 
    "WHERE name = :name " + 
    "AND address = :address"
    , nativeQuery=true)
    List<SampleUserEntity> getNativeSql(
        @Param("name") String name,
        @Param("address") String address
    );

Service

전체코드 : interface 생성
경로: base > service > sampleService.java

public interface SampleService {
	ResponseEntity<String> queryString();
}

전체코드 : interface 구현
경로: base > service > implement > sampleServiceImplement.java

@Service
@RequiredArgsConstructor
public class SampleServiceImplement implements SampleService {

	private final SampleUserRepository sampleUserRepository;

    @Override
    public ResponseEntity<String> queryString() {

        List<SampleUserEntity> sampleUserEntities = sampleUserRepository.getNativeSql("홍길동", "부산광역시");
        
        return ResponseEntity.status(HttpStatus.OK).body(sampleUserEntities.toString());
    }
}

Dto

전체코드

경로: base > dto > PostUserRequestDto.java

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class PostUserRequestDto {

    @NotBlank
    private String userId;
    @NotBlank
    private String password;
    @NotBlank
    private String name;
    private String address;
    @NotBlank
    private String telNumber;

}

Entity

전체코드

경로: base > entity > SampleUserEntity.java

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructo@ToString
@Entity(name="user")
@Table(name="sample_user")
public class SampleUserEntity {
    
    @Id
    private String userId;
    private String password;
    private String name;
    private String address;
    private String telNumber;    
}

Controller

전체코드

경로: base > controller > SampleController.java

@RestController
@RequestMapping("/sample")
@RequiredArgsConstructor
public class SampleController {
	
    @GetMapping("")
    public ResponseEntity<String> queryMethod() {
        ResponseEntity<String> response = sampleService.queryString();
        return response;
    }

}

0개의 댓글