JPQL
엔티티 객체를 조회하는 객체지향 쿼리이다 테이블 대상이 아닌 객체를 대상으로 쿼리를 실행한다
간단한 예시를 보면 아래 sql문은 테이블 전체를 조회하는 반면 jpql은 Member객체를 조회하는 것을 볼 수있다
실행이 될때는 결국 sql문을 변환되어 실행이 된다 이때 어느 한 데이터베이스에 종속 된 것이 아니기 때문에 방언만 변경을 해주면 해당 데이터베이스에 맞게 변환하여 실행한다
- sql
select * from Member m
- jpql
select m from Member m
기본 규칙
- 엔티티나 속성에 관해서는 대소문자를 구별하지만 select, from 과 같은 키워드 문법에 대해서는 대소문자를 구별하지 않는다
- from 절에는 클래스 명이 아닌 엔티티 명을 지정한다(
@Entity(name="이곳에 지정한 이름")
) - 별칭은 필수 이다, as는 생략할수 있다
기본 문법
em.createQuery("select m from Member m where m.name= :name", Member.class)
.setParameter("name", name);
:name
- 파라미터를 이름으로 구분
em.createQuery("select m from Member m where m.name= ?1", Member.class)
.setParameter(1, name);
?1
- 순서로 구분
반환 타입
- TypeQuery -
em.createQuery
메소드 두번째 변수로 반환타입이 있으면 해당 클래스로 반환 - Query - 반환타입을 지정을 안하거나 여러 값을 select할 경우 처럼 지정이 불가능 한경우
select시 DTO로 동시에 변환
em.createQuery("select new packge명.MemberDTO(m.name, m.age) from Member m", MemberDTO.class);
new 명령어와 함께 패키지명을 전부 작성해줘야 한다
페이징
setFirstResult()
, setMaxResults()
를 사용하여 시작점, 몇개를 가지고올지를 설정
Type
엔티티의 상속 구조에서 조회 대상을 특정 자식 타입으로 한정할 때 사용된다
Item(부모클래스) - Book, Movie(자식클래스)라고 할때
select i from Item i where type(i) = Book
으로 하면 Book타입만 조회한다
사용자정의함수
데이터베이스 내에서 추가적으로 내가 정의한 함수를 불러오고 싶으면 미리 등록후 사용을 해야한다
- 등록방법
public class My extends H2Dialect{ public My(){ registerFunction("호출시 사용할 이름", new StandardSQLFunction("사용자정의함수이름", StandardBasicType.STRING)); } }
그외기본적으로 SQL에서 제공하는<property name="hibernate.dialect" value="패키지명.My">
orderBy,[inner] join, left [outer] join, theta join, in, all, any, some, 서브쿼리, 통계함수, 연산자, case
등을 지원한다 어떻게 사용하는지 보고 필요시 추가적으로 찾아보면 될듯 하다
이때 join, outer join은 JPA에서는 다른 엔티티와 연관관계를 가지기 때문에 문법이 약간 다르다
select m from Member m join m.team t
와 같이 연관관계를 가진 객체를 가지고 객체 그래프를 통해 조인을 한다
참고
자바 ORM 표준 JPA 프로그래밍 - 기본편_김영한 님 강의
https://www.inflearn.com/course/ORM-JPA-Basic
책 - 자바 ORM 표준 JPA 프로그래밍
http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788960777330
'공부기록 > JPA' 카테고리의 다른 글
JPA Proxy 객체 사용 기 (0) | 2023.01.06 |
---|---|
JPA- JPQL (0) | 2022.01.31 |
JPA-값타입 (0) | 2022.01.27 |
JPA-프록시 (0) | 2022.01.26 |
JPA-고급매핑2 (0) | 2022.01.20 |