[TIL-SpringBoot]JPQL과 Query

이용준·2023년 3월 14일
0

TIL

목록 보기
13/21
  • JPQL - JPA Query Language의 줄임말로 JPA에서 사용할 수 있는 쿼리 의미
  • SQL 문법과 유사하나 컬럼명 대신 매핑된 엔티티명과 필드명 사용
    - 엔티티 객체를 대상으로 수행되는 쿼리이므로
  • 기본 구조
    	```java
    	SELECT p FROM Product p WHERE p.number = ?1;
    				  엔티티타입         엔티티속성
    	```

쿼리 메서드 생성

  • 주제(Subject)와 서술어(Predicate)로 구분
List<Person> findByLastnameAneEmail(String lastName, String email);

주제 키워드

  • exists -By
    * 특정 데이터 유무 확인하며 boolean 타입 반환

    	 ```java
    	 boolean existsByNumber(Long number);
    	 ```
  • count -By
    * 조회 쿼리 수행한 후 결과로 나온 레코드 리턴

    	 ```java
    	 long countByName(String name);
    	 ```
  • delete -By or remove -By
    * 삭제 쿼리 수행

    	 ```java
    	 void deleteByNumber(Long number);
    	 long removeByNumber(String name);
    	 ```

조건자 키워드

  • Is
    * 값의 일치를 조건으로 사용하는 조건자 키워드(Equals와 동일한 기능 수행)
    	 ```java
    	 Product findByNumberIs(Long number);
    	 ```
  • And, Or
    * 여러 조건 묶을때 사용
    	 ```java
    	 Product findByNumberAndName(Long number, String name);
    	 ```

@Query 어노테이션 사용하기

  • JPQL 사용시 JPA 구현체에서 자동으로 쿼리문 해석하고 실행
  • DB를 변경할 경우 없을 경우 해당 데이터베이스에 특화된 SQL 작성 가능
  • 주로 튜닝된 쿼리 사용시 작성

@Query 어노테이션 사용하는 메서드

@Query("select p from Product p where p.name = ?1")
List<Product> findByName(String name);
  • ?1, 첫번째 파라미터
  • 순서 바뀔 경우 오류 발생할 수 있음

@Query + @Param 사용한 메서드(파라미터 바인딩)

@Query("select p from Product p where p.name = :name")
List<Product> findByName(@Param("name") String name);

특정 컬럼만 추출하는 쿼리

@Query("select p.name, p.price p.stock from Product p where p.name = :name")
List<Object[]> findByNameParam2(@Param("name") String name);

Left Join

  • 연관 관계 없는 엔티티 조인 처리에는 on

Provider(1) - Product(N)의 엔티티가 있다고 가정해보자.
이 경우 Product(N) 쪽이 @ManyToOne으로 Provider(1)을 참조하고 있으나 Provider(N)은 Product(1) 를 참조하지 않는 상황이다. 이런 경우 직접 조인에 필요한 조건은 on을 사용해 작성해야 한다.
(특정 회사에 속한 상품들을 조회하는 경우)

@Query("select r, t 
	   from Provider r left join Product t 
	   on t.provider = r 
	   where r.productId =: productId")
List<Object[]> getProviderWithProduct(@Param("productId") Long productId);
profile
뚝딱뚝딱

0개의 댓글