쿼리메서드, JPQL

0

JPA

목록 보기
7/15

CrudRepository<A, String>

  • save: insert또는 update가능.
  • find : select
  • delete : delete

-> 위와 같이 간단한 sql구문은 처리할 수 있지만,
서브쿼리나 inline 정렬 등등.. 어려워
-> 메서드를 직접 만들어야한다.

  • CrudRepository<A, String>를 구현한 클래스에 정의함

쿼리 메서드

  • List<A> findByA_2(BigDecimal digdec);
    임의 메서드 생성 -> 알아서 자동 sql구문 실행됨
    ➡︎ 쿼리메서드 라고 한다. 스프링 jpa의 기본 메서드도 좋지만 나름대로 쿼리메서드를 만들어 낼 수 있다.
    find엔티티이름By컬럼명 구성으로 메서드명을 짓는다. 엔티티이름은 빼도 됨.
    여러 정보를 담으려면 List타입으로 반환타입을 정의해라.
    -> 네이밍 규칙 중요!!!!!!

더 복잡한 쿼리를 쓰고 싶을 때..?

: JPQL 이라는 문법을 지킨 sql구문을 만들어줘야함.

// 예시
@Query("SELECT p FROM product p WHERE prod_name LIKE %:word%")
@Query(value ="SELECT * FROM 테이블", nativeQuery= true) // 그냥 일반 쿼리 사용
     public List< Product> findByName(@org.springframework.data.repository.query.Param("word") String name);
  • product: entity 클래스이름(TABLE name 아님!)
  • prod_name : product라는 클래스가 가지고 있는 멤버변수 (컬럼아님)
  • #{} 와 같은 :word - 매개변수로 word를 가지고 있어야함
    -->JPQL이 아니라 그냥 SQL구문을 사용할 수도 있음

    // 대소문자 구분 : 엔티티명과 속성명은 대소문자를 구분한다.
    // 하지만, 키워드는 대소문자 구분 안함(select)
    @Query("SELECT pNo FROM P") // select: 변수명 , from: entity명, * 특수기호 사용안됨
    public List<String> findTest1();
    // *의 역할을 하기 위해서 (SELECT prod FROM P prod") 처럼은 사용 가능
    //public List<P> findTest1(); // 이땐 반환타입 객체로 줘야함


    // native query이용하기.
    @Query(value = "SELECT p_no, p_name FROM p_tbl", nativeQuery = true)
    public List<Object[]> findTest2();  // 반환타입 list로 사용 불가 object배열 형식으로 받아와야 함
    // *라면 컬럼의 순서와 클래스의 멤버변수의 순서를 맞추는것이 위험한 작업임. 유연하게 쓸 수 있또록 Object[] 배열화시킴.
  • native query를 사용할 때에는 반환타입 list로 사용 불가!! object배열 형식으로 받아와야 함
    • select * 라면 컬럼의 순서와 클래스의 멤버변수의 순서를 맞추는것이 위험한 작업임.
      유연하게 쓸 수 있또록 Object[] 배열화시킴.

발전

  • 쿼리메서드 -> JPQL -> NATIVE SQL
    -> 복잡한 sql구문은 네이티브로 처리하되 그 외 충분히 trigger로 처리될 수 있는 부분은 트리거 사용 & 프로시저 가능하면 프로시저 이용
profile
백엔드를 공부하고 있습니다.

0개의 댓글