📒 Spring 숙련
JPQL (Java Persistence Query Language)
테이블이 아닌 객체를 검색하는 객체지향 쿼리
SQL을 추상화 했기 때문에 특정 벤더에 종속적이지 않음
JPA는 JPQL을 분석하여 SQL을 생성한 후 DB에서 조회
사용시 주의할 점
대소문자 구분
엔티티 이름
별칭
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);