지나공 : 지식을 나누는 공간

JPA 8 : JPQL 기본 문법과 쿼리 API 본문

Tech/JPA

JPA 8 : JPQL 기본 문법과 쿼리 API

해리리_ 2020. 12. 9. 00:33

이건 개인적으로 잘 몰랐던 부분만 기록할 예정.

 

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
Comments