SQL이 테이블을 대상으로 쿼리를 하는 반면
JPQL은 객체를 대상으로 쿼리를 한다.
Query Annotation는 Entity의 JpaRepository를 상속받는 인터페이스에 정의한다.public interface UserRepository extends JpaRepository<User, Long> {
@Query(value = "쿼리문")
List<User> methodName();
public interface UserRepository extends JpaRepository<User, Long> {
@Query(value = "select user " +
"from User user " +
"where user.name = :name")
List<User> findByName(@Param("name") String name);
쿼리문 작성시 반드시 띄어쓰기를 인지하기 때문에 띄어 쓰기를 해주는 것이 좋다. (문장 구별을 위함)
=> 하지만 띄어쓰기를 신경써야하고, type-check 불가능 및 runtime 오류 발견 가능하다는 단점이 있기 때문에 아래 query DSL 을 주로 사용하긴 한다.
오픈 소스 빌더 API 이다.=> 쿼리 내용을 함수 형태로 제공하여 문자열 형태인 JPQL을 보완함
@PersistenceContext
EntityManager em;
public List<Person> selectPersonByNm(String firstNm, String lastNm){
JPAQueryFactory jqf = new JPAQueryFactory(em);
QPerson person = QPerson.person;
List<Person> personList = jpf
.selectFrom(person)
.where(person.firstName.eq(firstNm)
.and(person.lastName.eq(lastNm))
.fetch();
return personList;
}
코드가 길어지기는 했으나 유지 보수 및 타입 체킹이 원활하게 이루어 질 수 있다. (의존성 추가 필요)