JPQL 이란?
- JPQL은 엔티티 객체를 조회하는 객체지향 쿼리입니다.
- 따라서 테이블을 대상으로 조회 하는 것 이 아니라엔티티 객체를 대상으로 조회 할 수 있습니다.
- JPA는 JPQL을 분석한 후 적절한 SQL을 만들어 데이터베이스를 조회하며
- 방언(Dialect)를 활용하여 JPQL을 수정하지 않고, 사용하고 있는 DB에따라 변경 가능합니다.
- SQL과 문법이 유사하고, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 등을 사용할 수 있습니다.
JPQL 특징
- 엔티티와 속성은 대소문자를 구분하여 사용합니다.
- 테이블 명 대신 엔티티 명을 사용하고, @Entity(name = "name") 으로 Entity 명을 지정 할 수 있습니다.
- 지정하지 않을 경우에는 클래스명을 기본값으로 사용합니다.
- JPQL은 별칭을 필수로 사용하며, AS는 생략하여 사용 할 수 있습니다.
JPQL 실행
Query
Query mem1 = em.createQuery("select m.age,m.username from Member m");
- 반환 타입을 명확하게 지정할 수 없는 경우나, 여러 엔티티나 컬럼을 조회 할 경우 사용합니다.
- 해당 쿼리는 age와 username의 반환 타입이 다름으로 Query를 이용하여 조회되는것을 볼수 있습니다.
TypeQuery
TypedQuery<Member>mem = em.createQuery("select m from Member m ",Member.class);
- 반환할 타입을 명확하게 지정할 수 있는 경우에만 사용합니다.
- 해당 쿼리는 반환타입이 Member.class로 명확하게 지정하여 조회 해서 TypedQuery를 이용하여 조회되는것을 볼 수 있습니다.
JPQL 조회
query.getSingleResult()
Member mem = em.createQuery("select m from Member m where m.username ='member1'",Member.class)
.getSingleResult();
System.out.println("사용자이름 : " + mem.getUsername());
- 결과가 정확히 하나일 때 사용하며 결과가 2개 이상일 경우 오류를 발생시킵니다.
- 해당 쿼리는 username이 member1인 경우만 출력하여 값이 하나 임으로 getSingleResult를 사용하여 조회되는것 을 볼 수있습니다.
query.getResultList()
List<Member>mem = em.createQuery("select m from Member m ",Member.class)
.getResultList();
for(int i=0; i<5; i++){
System.out.println( mem.get(i).getUsername());
}
- 여러 결과를 뽑아낼 수 있으며 결과가 없을 경우 빈 컬렉션을 반환합니다.
- 해당쿼리는 테이블에 Member가 여러개 담겨있어 여러 값을 출력함으로 getResultList를 사용하여 조회 되는것을 볼수 있습니다.
JPQL 파라미터 바인딩
이름 기준 파라미터(Named parameters)
Member mem = em.createQuery("select m from Member m where m.username = :username",Member.class)
.setParameter("username","member1")
.getSingleResult();
System.out.println("사용자이름 : " + mem.getUsername());
- 파라미터를 이름으로 구분합니다.
- setParameter에 이름으로 파라미터를 지정하여 username의 값을 넣어 조회되는것을 볼 수 있습니다.
위치 기준 파라미터(Positional parameters)
Member mem = em.createQuery("select m from Member m where m.username = ?1",Member.class)
.setParameter(1,"member1")
.getSingleResult();
System.out.println("사용자이름 : " + mem.getUsername());
- ( ? )물음표 다음에 오는 위치 순서대로 값을 지정합니다.
- setParameter에 숫자를 지정하여 위치 순서대로 값을 조회하는것을 볼 수 있습니다.
- 위치 기준 파라미터 보다는 이름 기준 파라미터를 쓰는것이 유지보수에 용이합니다.
JPQL페이징 API
List<Member>mem = em.createQuery("select m from Member m order by m.age desc",Member.class)
.setFirstResult(0)
.setMaxResults(10)
.getResultList();
System.out.println("ListSize : " +mem.size());
for(Member a : mem){
System.out.println("Member" + a);
}
- setFirstResult : 조회 시작 위치를 지정합니다.
- setMaxResults : 조회할 데이터 수를 지정합니다.
- DB의 방언별로 쿼리를 변경하여 출력해줍니다.
- 실행결과 위와같이 결과가 정상적으로 출력됨을 알 수 있습니다.
'JPA' 카테고리의 다른 글
[JPA] JPQL 2 (JOIN ,SUBQUERY ,조건식) (0) | 2022.01.26 |
---|---|
[JPA] Fetch Join (0) | 2022.01.11 |