230626_ JPQL

hoy_·2023년 6월 26일
0

Today, I Learned

목록 보기
26/36

1. 오늘의 일정

  1. 📒 Spring 숙련




2. 배운 내용


1. JPQL

JPQL (Java Persistence Query Language)

테이블이 아닌 객체를 검색하는 객체지향 쿼리
SQL을 추상화 했기 때문에 특정 벤더에 종속적이지 않음
JPA는 JPQL을 분석하여 SQL을 생성한 후 DB에서 조회

사용시 주의할 점

  • 대소문자 구분

    • 엔티티 이름인 Member, 그리고 Member의 속성 name은 대소문자를 구분해줘야 한다.
      SELECT, FROM, AS 같은 JPQL 키워드는 대소문자를 구분하지 않아도 된다.

  • 엔티티 이름

    • JPQL에서 사용한 Member는 클래스 이름이 아닌 엔티티 이름이다. 엔티티 이름은 @Entity(name="abcd")로 설정 가능하다.
      name 속성을 생략하면 기본 값으로 클래스 이름을 사용한다.
  • 별칭

    • JPQL에서 엔티티의 별칭은 필수적으로 명시해야 한다.
      별칭을 명시하는 AS 키워드는 생략할 수 있다.



2. 사용자 정의 쿼리

  • 쿼리 메서드
    • 메서드 이름으로 우리가 원하는 기능을 수행할 쿼리가 자동으로 생성되게 할 수 있다.
    • 쿼리 메서드 기능은 Spring Data JPA 에서 정해놓은 네이밍 컨벤션을 지키면 JPA가 해당 메서드 이름을 분석해서 적절한 JPQL 을 구성한다.

  • @Query 애너테이션
    • 메서드 명은 기존 자동생성 방식과 달리 자유롭게 작성할 수 있다.
    • Repository 를 구현한 하위 인터페이스(CrudRepository, JpaRepository 등)을 구현해 사용한다.
    • 테이블이 아닌 엔티티를 대상으로 쿼리문을 보낸다.
	public interface UserRepository extends JpaRepository<User, Long> {
    	@Query("쿼리문")
    	List<User> methodName();

	@Query("SELECT b FROM Board b") // JPQL은 명칭 대소문자 구분함
    List<Board> findAllBoard(); // 메서드 이름은 상관 없음

    @Query("SELECT b FROM Board b WHERE b.title=?1 AND b.writer=?2")
    List<Board> findByTitleAndWriter2(String title, String writer);

    @Query(value="SELECT * FROM BOARD", nativeQuery = true)
    List<Board> findAllBoardBySQL();

    @Query(value="SELECT TITLE, WRITER FROM BOARD", nativeQuery = true)
    List<Object[]> findAllBoardBySQL2();

// << @Query를 이용
  ------------

// << 쿼리 메서드를 이용

    // SELECT COUNT(*) FROM BOARD WHERE WRITER = :writer
    int countAllByWriter(String writer);

    // SELECT * FROM BOARD WHERE WRITER = :writer
    List<Board> findByWriter(String writer);

    // SELECT * FROM BOARD WHERE TITLE = :title AND writer = :writer
    List<Board> findByTitleAndWriter(String title, String writer);

    // DELETE FROM BOARD WHERE WRITER = :writer
    @Transactional // delete의 경우, 여러 건을 delete 할 수 있기 때문에 Tx처리 필수
    int deleteByWriter(String writer);


profile
배우는 사람

0개의 댓글