JPQL은 엔터티 객체를 중심으로 개발할 수 있는 객체 지향 쿼리로 SQL문보다 간결하며 특정 DBMS에 의존하지 않는다. dialect를 통해 사용자의 DBMS에 맞게 SQL을 실행해준다.
String jpql = "SELECT m FROM Menu as m WHERE m.menuCode = 8";
JPQL
을 작성할 때 반드시 엔티티는 별칭을 사용해야 한다.JPQL
은 엔티티를 사용하기 위해서 작성하는 것이다. 그렇기 때문에 테이블명이 아닌 엔티티명으로 작성해야 한다. entityManager.createQuery(만들고자 하는 JPQL문);
TypedQuery
: 반환 타입을 명확하게 지정할 때 사용한다. Query
: 반환 타입을 명확하게 지정할 수 없는 경우에 사용하며 Object나 Object[]가 반환된다. getSingleResult()
: 결과가 정확히 1개의 행인 경우 사용하며 없거나 많으면 예외가 발생한다.getResultList()
: 결과가 2행 이상일 경우 사용하며 컬렉션을 반환한다. 결과가 없으면 빈 컬렉션을 반환한다. TypedQuery<자료형>
로 지정해서 사용하고 있다.getSingleResult()
를 사용하고, 여러 행이 나오는 경우에는 getResultList()
를 사용한다.// 1. 지정된 타입으로 menuName을 가져오는 경우
public String selectSingleMenuByTypedQuery() {
// menuName만 가져오는 경우
String jpql = "SELECT m.menuName FROM Section01Menu as m WHERE m.menuCode = 8";
TypedQuery<String> query = entityManager
.createQuery(jpql, String.class);
String resultMenuName = query.getSingleResult();
return resultMenuName;
}
// 2. menu 엔티티의 모든 필드값을 가져오기
public Menu selectSingleRowMenuByTypedQuery() {
// menu라는 엔티티 그 자체를 조회한다는 의미임
String jpql = "SELECT m FROM Section01Menu as m WHERE m.menuCode = 8";
TypedQuery<Menu> query = entityManager.createQuery(jpql, Menu.class);
Menu resultMenu = query.getSingleResult();
return resultMenu;
}
// 3. 여러 행을 가져오기 : getResultList()를 사용
public List<Menu> selectMultiRowMenuByTypedQuery() {
// 모든 행을 가져오기
String jpql = "SELECT m FROM Section01Menu m";
TypedQuery<Menu> query = entityManager.createQuery(jpql, Menu.class);
List<Menu> menuList = query.getResultList();
return menuList;
}
public Object selectSingleMenuByQuery() {
String jpql = "SELECT m.menuName FROM Section01Menu as m WHERE m.menuCode = 8";
Query query = entityManager.createQuery(jpql);
Object resultMenuName = query.getSingleResult();
return resultMenuName;
}
간단하게 각각의 역할을 설명하면
DISTINCT
: 중복 없이 조회IN
: in안에 잇는 값들을 조회LIKE
: %로 둘러싸인 글자가 포함되어 있는 메뉴를 조회/* 1. tbl_menu의 categoryCode 중복 없이 조회 */
public List<Integer> selectUsingDistinct(){
String jpql = "SELECT DISTINCT m.categoryCode FROM Section01Menu m";
TypedQuery<Integer> query = entityManager.createQuery(jpql, Integer.class);
List<Integer> menuCategory = query.getResultList();
return menuCategory;
}
/* 2. tbl_menu의 11,12 카테고리 코드를 가진 메뉴 목록 조회 */
public List<Menu> selectUsingIn(){
String jpql = "SELECT m FROM Section01Menu m WHERE m.categoryCode in(11,12) ";
TypedQuery<Menu> query = entityManager.createQuery(jpql, Menu.class);
List<Menu> menuList = query.getResultList();
return menuList;
}
/* 3. tbl_menu의 "마늘"이 메뉴명에 포함 된 메뉴 목록 조회*/
public List<Menu> selectUsingLike(){
String jpql = "SELECT m FROM Section01Menu m WHERE m.menuName like '%마늘%'";
List<Menu> menuList = entityManager.createQuery(jpql, Menu.class).getResultList();
return menuList;
}