CrudRepository<A, String>
-> 위와 같이 간단한 sql구문은 처리할 수 있지만,
서브쿼리나 inline 정렬 등등.. 어려워
-> 메서드를 직접 만들어야한다.
쿼리 메서드
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[] 배열화시킴.
*
라면 컬럼의 순서와 클래스의 멤버변수의 순서를 맞추는것이 위험한 작업임.