JPA의 라이브러리 중
개발자가 직접 SQL을 작성하는 기능으로는
쿼리메소드
@Query
두가지가 있다.
공식문서
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods
먼저 쿼리메소드부터 알아보자
쿼리메소드란?
간단하게 함수이름으로 SQL문 만들기이다.
단점으로는 함수 이름이 엄청 길다.
※중요
규칙대로 낙타 표기법으로 만들어야한다.
( 한글자라도 잘못 입력하면 서버가 죽는다. )
엔티티의 이름은 생략이 가능합니다. find + (엔티티 이름) + By + 변수 이름
예시
findAllByOrderByDnoDesc 란?
( 전체조회 + Dno라는 컬럼으로 내림차순 )
( SQL 문 : SELECT * FROM DEPT ORDER BY DNO DESC )
@Repository // @Repository - 클래스 위에 붙이고 , 스프링 서버가 실행될때 자동으로 객체 1개를 만들어줌 (IOC)
// TODO : 인터페이스명 extends JpaRepository<모델클래스명 , 기본키의 자료형>
public interface DeptRepository extends JpaRepository<Dept,Integer> {
// TODO: 1번 전체 조회 + 정렬 (내림차순)
List<Dept> findAllByOrderByDnoDesc();
}
@Query 란?
약간 SQL문을 우리가 작성해서 결과를 도출함
오라클 쿼리
객체 쿼리
두가지로 나뉜다.
< 1 >
먼저 오라클 쿼리를 보자
※중요
( 1 )
오라클 쿼리를 사용할려면
nativeQuery = true
로 해주어야 한다.
( 2 )
콜론 ( : ) 을 사용하여 매개변수인것을 알려줘야한다.
( 3 )
@Param은 안써도 되지만 가급적이면 쓰자.
예시
( DEPT 라는 테이블에 dname Like 검색 )
// TODO: 전체조회 + dname LIke 검색 : @Query
@Query(value = "SELECT TD.* FROM TB_DEPT TD WHERE TD.DNAME LIKE %:dname%",nativeQuery = true)
List<Dept> selectByDname(@Param("dname") String dname);
다만, 현재 JPA 버그가 있으므로 이쪽을 씁니다.
@Query(value = "SELECT TD.* FROM TB_DEPT TD WHERE TD.DNAME LIKE '%' || :dname ||'%'",nativeQuery = true)
List<Dept> selectByDname(@Param("dname") String dname);
ORACLE SQL
만약 그룹함수의 경우라면
리턴값을 어떻게 설정해야할까?
DTO 클래스에 저장하면 된다.
( 오라클 쿼리는 DTO를 인터페이스로 만들어 주어야 함 )
단, 속성이 아닌 getter 로 만들어야 한다.
Repository
( AS 별칭 필수 )
// 부서테이블의 부서번호를 sum , avg , max , min 값을 출력하는 함수를 작성하세요
// 단 , nativeQuery = true 사용
// , DTO 클래스에 저장하세요
@Query(value = "SELECT SUM(D.DNO) AS sumVar , AVG(D.DNO) AS avgVar , MAX(D.DNO) AS maxVar , MIN(D.DNO) AS minVar FROM TB_DEPT D",nativeQuery = true)
List<DeptGroupDto> selectByGroupFunc();
DTO
( GETTER 필수 )
public interface DeptGroupDto {
// 속성 => 상수 x
// getter 함수 형태로 만들어야함
// sumVar , avgVar , maxVar , minVar
Integer getSumVar();
Integer getAvgVar();
Integer getMaxVar();
Integer getMinVar();
}
Service
public List<DeptGroupDto> selectByGroupFunc() {
List<DeptGroupDto> list = Repository.selectByGroupFunc();
return list;
}
< 2 >
이번에는 객체 쿼리이다.
객체 쿼리를 만드는 방법
1. 테이블명 => 클래스명
2. 컬럼명 => 속성명
3. *을 사용하지 않음 => 클래스명의 별칭을 붙여서 사용
4. 대소문자를 구분, nativeQuery=true 를 생략한다.
장점
성능이 좋다
단점
조인문을 잘못쓰면 성능이 대폭 저하된다.
예제
( SELECT 별칭 FROM 클래스명 WHERE (클래스의)속성명 LIKE ... )
@Query(value = "SELECT TD FROM Dept TD WHERE TD.dname LIKE '%' || :dname ||'%'")
List<Dept> selectByDname(@Param("dname") String dname);
'SpringBoot > JPA' 카테고리의 다른 글
SpringBoot - JPA - 조인 ( 1 대 다 관계 ) (0) | 2023.10.19 |
---|---|
SpringBoot - JPA - 페이징 처리 (1) | 2023.10.18 |
SpringBoot - JPA - Repository (인터페이스) (0) | 2023.10.16 |
SpringBoot - JPA - Entity class (1) | 2023.10.16 |
SpringBoot - JPA - BaseTimeEntity (생성일자 , 수정일자) (0) | 2023.10.16 |