엔터티 객체를 중심으로 개발할 수 있는 객체 지향 쿼리
SQL보다 간결하며 DBMS에 상관없이 개발이 가능하다. (특정 DBMS에 의존하지 않는다.)
JPQL은 데이터베이스에 SQL을 실행해서 결과를 조회한다.(영속성 컨텍스트에 이미 존재하면 기존 엔터티를 반환하고 조회한 것은 버린다.)
JPQL
은 엔터티 객체를 대상으로 쿼리를 질의하고 SQL
은 데이터베이스의 테이블을 대상으로 질의한다.
1. select
select
FROM
WHERE
GROUP BY
HAVING
ORDER BY
2. insert
EntityManager가 제공하는 persist() 메소드를 사용하면된다.
3. update
update
WHERE
4. delete
delete
WHERE
특징
엔터티와 속성은 대소문자를 구분한다.
select, from과 같은 기본 키워드는 대소문자를 구분하지 않는다.
별칭을 필수로 사용해야하며 별칭없이 작성하면 에러가 발생한다.
TypedQuery
: 반환할 타입을 명확하게 지정하는 방식일 때 사용(쿼리 객체의 메소드 실행 결과로 지정한 타입이 반환된다.)Query
: 반환할 타입을 명확하게 지정할 수 없을 때 사용(쿼리 객체 메소드의 실행 결과로 Object or Object[ ]이 반환된다.) getSingleResult()
: 결과가 정확히 한 행일 경우 사용(없거나 많으면 예외발생)getResultList()
: 결과가 2행 이상일 경우 사용하며 컬렉션을 반환한다.(결과가 없으면 빈 컬렉션 반환) @Test
public void JPQL을_이용한_단일행_조회_테스트() {
//when
String jpql = "SELECT m FROM section01_menu as m WHERE m.menuCode = 7";
TypedQuery<Menu> query = entityManager.createQuery(jpql, Menu.class);
//반환 타입을 row와 매핑할 엔티티 타입(Menu.class)으로 설정
//createQuery(실행할구문, 반환받을 타입);
Menu foundMenu = query.getSingleResult();
//then
assertEquals(7, foundMenu.getMenuCode());
System.out.println(foundMenu);
}
1. 이름 기준 파라미터(named parameters)
':' 다음에 이름 기준 파라미터를 지정한다.
String jpql = "SELECT m FROM section02_menu m WHERE m.menuName = :menuName";
// setParameter안에 'menuName'과 ':menuName' 동일하게
List<Menu> menuList = entityManager.createQuery(jpql, Menu.class)
.setParameter("menuName", menuNameParameter)
.getResultList();
2. 위치 기준 파라미터(positional parameters)
'?' 다음에 값을 주고 위치 값은 1부터 시작한다.
String jpql = "SELECT m FROM section02_menu m WHERE m.menuName = ?1";
List<Menu> menuList = entityManager.createQuery(jpql, Menu.class)
.setParameter(1, menuNameParameter)
.getResultList();