BE전문가 프로젝트
JPQL(Java Persistence Query Language) 본문
JPQL소개
- JPQL은 객체지향 쿼리 언어이다. 따라서 테이블을 대상으로 쿼리하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다.
- JPQL은 SQL을 추상화해서 특정데이터베이스 SQL에 의존하지 않는다
- JPQL은 결국 SQL로 변환된다.
JPQL 문법
- select m from Member as m where m.age > 18
- 엔티티와 속성은 대소문자 구분O(Member, age)
- JPQL 키워드는 대소문자 구분X(SELECT, FROM, where)
- 엔티티 이름 사용, 테이블 이름이 아님(Member)
- 별칭은 필수(m) as는생략 가능
집합과 정렬
- COUNT, SUM, AVG, MAX, MIN 전부 사용 가능
- Group By, Having
- Order By
TypeQuery, Query
- TypeQuery - 반환 타입이 명확할 때 사용
- Query - 반환 타입이 명확하지 않을 때 사용
TypedQuery<Member> query = em.createQuery("select m from Member m", Member.class);
Query query1 = em.createQuery("select m.age, m.username from Member m");
age와 username은 int와 String 임으로 반환 타입이 명확하지 않기 때문에 Query 사용
결과 조회 API
- query.getResultList(): 결과가 하나 이상일 때, 리스트 반환 결과가 없으면 빈 리스트 반환
- Query.getStringResult(): 결과가 정확히 하나, 단일 객체 반환 결과가 없으면: javax.persistance.NoResultException 둘 이상이면: javax.persistance.NonUniqueResultException
TypedQuery<Member> query = em.createQuery("select m from Member m", Member.class);
//둘 이상일 때
List<Member> resultList = query.getResultList();
//하나일 때
Member result = query.getSingleResult();
파라미터 바인딩 - 이름 기준, 위치 기준
//이름 기준
TypedQuery<Member> query = em.createQuery("select m from Member m where m.username =:username", Member.class);
query.setParameter("username", "member1");
Member result = query.getSingleResult();
//순서 기준
Member result = em.createQuery("select m from Member m where m.username = ?1", Member.class)
.setParameter(1, "member")
.getSingleResult();
Comments