지나공 : 지식을 나누는 공간
JPA 8 : JPQL 기본 문법과 쿼리 API 본문
이건 개인적으로 잘 몰랐던 부분만 기록할 예정.
JPQL 문법의 특징
- select m from Member as m where m.age > 18
- 엔티티와 속성은 대소문자를 구분한다.
- JPQL 키워드는 대소문자 구분을 하지 않는다. select, from where 등은 대소문자 다 가능
- 엔티티 이름을 사용한다. 테이블 이름을 사용하지 않는다.
- 별칭은 필수이고 as는 생략 가능하다. hibernate는 별칭 안 써도 가능은 한데 본래 문법은 별칭 필수다.
- 클래스 이름이 똑같다면...클래스 이름을 바꾸는 게 안 헷갈리고 낫습니다...
@Entity(name = "MM")
public class Member{
@Id @GeneratedValue
private Long id;
}
위의 코드에서 엔티티 이름은 MM이다. 따라서 JPQL에서 Member가 아니라 MM으로 사용해야 한다.
TypeQuery, Query
TypeQuery : 반환 타입이 명확할 때 사용
Query : 반환 타입이 명확하지 않을 때 사용
TypeQuery<Member> query =
em.createQuery("SELECT m FROM Member m", Member.class); //(1)
Query query =
em.createQuery("SELECT m.userName, m.age FROM Member m");//(2)
TypeQuery<String> query =
em.createQuery("SELECT m.userName FROM Member m", String.class);//(3)
(1), (3)은 반환타입이 명확하지만 (2)처럼 m.userName과 m.age를 같이 가져오면 둘이 타입이 달라서 하나로 정할 수가 없으니까 Query를 사용한다.
어떻게 출력하는가?
TypeQuery<Member> query =
em.createQuery("select m from Member m", Member.class);
List<Member> resultList = query.getResultList();
for(Member member : resultList){
System.out.println("member = " + member);
}
위처럼 resultList를 받아서 하나씩 출력이 가능하다. 컬력션을 받을 수 있다.
만약 값이 하나라면 query.getSingleResult();를 하면 된다.
조회 결과에 따른 반환 내용
- query.getReusltList()는 결과가 하나 이상일 때 리스트를 반환하고 없으면 빈 리스트를 반환한다.
- query.getSingleResult()는 결과가 정확하게 하나일 때 단일 객체를 반환하고 그게 아닐 때 Exception 발생
- 결과가 없으면 : javax.persistence.NoResultException
- 둘 이상이면 : javax.persistence.NonUniqueResultException
파라미터 바인딩 - 이름 기준, 위치 기준 가능
TypeQuery<Member> query =
em.createQuery("select m from Member m where m.username = :username", Member.class);
//파라미터 이름 기준 바인딩
//username이라는 파라미터의 값을 member1으로 하겠다는 의미
query.setParameter("username", "member1");
Member singleResult = query.getSingleResult();
//위의 코드를 체이닝으로 변경하면
Member result = em.createQuery("select m from Member m where m.username = :username", Member.class)
.setParameter("username", "member1")
.getSingleResult();
//파라미터 위치 기준 바인딩
query.setParameter(1, username);
위치 기준은 비추다. 되도록 사용 하지 않도록..!
728x90
'Tech > JPA' 카테고리의 다른 글
JPA 8 -2 : 조인, ON절, 서브쿼리, JPA 서브쿼리 한계 (0) | 2020.12.14 |
---|---|
JPA 8 -1 : 프로젝션, 페이징 (0) | 2020.12.13 |
JPA 7-2 : 값 타입 컬렉션 (0) | 2020.12.07 |
JPA 7-1 : 값 타입과 불변 객체, 값 타입 비교 (2) | 2020.11.10 |
JPA 7 : 임베디드 타입, JPA 데이터 타입 분류 (0) | 2020.11.09 |
Comments