DevBoi

[JPQL] JPQL 시작하기 본문

Develop/[JPA]

[JPQL] JPQL 시작하기

HiSmith 2022. 3. 10. 20:50
반응형

JPQL :  java persistance query language

JPQL은 엔티티 객체를 대상으로 쿼리한다.

JPQL은 SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않는다.

 

JPQL의 특징

-엔티티와 속성은 대소문자를 구분한다.

-JPQL 키워드는 대소문자를 구분하지 않는다.

-엔티티 이름을 사용하고, 테이블 이름을 사용하지 않는다.

-별칭을 필수이다.

 

TypeQuery, Query

TypeQuery -> 반환타입이 정확할때

Query -> 반환타입이 부정확할때

 

query.getResultList() -> 결과가 하나이상일때, 리스트 반환

-> 결과가 없으면 빈 리스트 반환

query.getSingleResult() -> 결과가 정확하게 하나 여야한다.

 

둘이상이거나, 0이면, Exception 이 뜬다.(noresult or nonuniqueResultException)

파라미터를 넘기기에 대한 방법이다.

메소드 체이닝 기법으로, 파라미터 세팅 및, 쿼리를 호출할수있다.

사실 잘 안쓸것같은데, 특별한 result 타입을 명시하지않고, 해당 object를 사용할수도있긴...하다.

근데 앵간하면 자료형을 만들어서 사용하지 않을까한다....1개면, wrapper클래스를 선언하면 되고 별도 result dto를 만들거나, map을 선언하거나 하지않을까....

 

 

 

위치 기반의 파라미터도 지원하는데, 장애 발생 위험이 커서, 실무에서는 잘 안쓴다.

 

쿼리로 받을때, 바로 영속성 컨텍스트에서 관리를 해줄때가 있는데, 해당 타입을 엔티티 프로젝션이라고 한다.

예를 들어서, 아래와 같이, 쿼리를 통해 모델을 받아와서, 해당 값을 변경하면 영속성 컨텍스트가 알아서 db update 쿼리 발사를 해준다.

 

임베디드 타입 프로젝션이 있고, 스칼라 타입 프로젝션이라는게 있다.

스칼라 타입 프로젝션(select s.memberName,s.memberId 처럼 막 거져온다.)

여러 값을 조회하는 경우, 아래와같은 방법으로 가져올수있다.

 

1. Query 타입으로 조회

2. Object[] 타입으로 조회

3. new 명령어로 조회(단순 값을 DTO로 바로조회가 가능)

 

3번 말고는 안해봤으니까 추가로 3번에 대해서만 실습을 해보자

 

 

 

쿼리 부분에서, MemberDto에 대한 생성자로, 호출하는것이다.

잘 안보이겠지만, 중요한 부분은 이렇다.

 

List<MemberDto> list4 = em.createQuery("select new com.example.demo.domain.MemberDto(m.memberName,m.memberId) from Member m where m.memberName =:memberName2",MemberDto.class)

 

해당 곽 같이 특별한 아니면 생성된 dto로 받을수도있다. 

반응형

'Develop > [JPA]' 카테고리의 다른 글

[JPA] 경로 표현식  (0) 2022.03.11
[jpa] 페이징 & 조인 & 쿼리 간략  (0) 2022.03.11
[JPA] JPQL 공부 시작하기전에...  (0) 2022.03.10
[JPA] 값 타입  (0) 2022.03.10
[JPA] 영속성 전이  (0) 2022.03.07