2022. 3. 28. 18:05ㆍJPA 기초
JPA는 다양한 쿼리 방법을 지원한다.
JPA Criteria, QueryDSL, 네이티브 SQL, Mybatis 등 다 같이 사용할 수 있다.
단, 영속성 컨텍스트를 적절한 시점에 강제로 플러시 필요하다. 영속성 컨텍스트에서 DB로 commit이나, 중간에 flush() 호출이 없으면 DB에는 아직 반영이 안되어있는 상태이기 때문이다.
JPQL은 쿼리를 날리기 전에 flush가 동작한다. 이후 쿼리가 실행된다. JPQL은 강제로 수동 flush()를 해줄 필요가 없다.
가장 기본이 되는 방법은 JPQL인데, 이거 잘하면 QueryDSL도 뚝딱이라고 한다.
얼른 쿼리문 짱고수 되고싶다..
먼저,
JPA를 사용하면 엔티티 객체를 중심으로 개발해야 한다. 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색한다. 하지만 !!!!!! 모든 DB를 객체로 변환해서 검색하는 것은 물론 불가능하다.
따라서 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다.
JPQL의 특징
• JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
• SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원
• JPQL은 엔티티 객체를 대상으로 쿼리
• SQL은 데이터베이스 테이블을 대상으로 쿼리
• 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리
• SQL을 추상화해서 특정 데이터베이스 SQL에 의존X
• JPQL을 한마디로 정의하면 객체 지향 SQL이다 !!!!
• JPQL은 결국 SQL로 변환된다.
JPQL의 단점을 들자면.. 쿼리문이 "SELCT m from Member m" 처럼 String이다.
따라서 동적 쿼리를 짜야 할 때 많이 복잡하고 실수하기 쉽다.
JPQL의 기본 문법과 기능
예시) Member라는 엔티티에 age라는 속성이 존재하고 있다.
select m from Member as m where m.age > 18
• 엔티티와 속성은 대소문자 구분O (Member, age)
• JPQL 키워드는 대소문자 구분X (SELECT, FROM, where) --> SQL과 동일하다.
• 엔티티 이름 사용, 테이블 이름이 아님(Member) --> 엔티티 이름은 클래스 명이 기본값이다. 그러니 엔티티 이름은 최대한 변경하지 말자.. 만약 클래스 이름이 같아서 엔티티 이름을 변경해야 한다면? 클래스 이름을 변경하자.
• 별칭은 필수(m) (as는 생략가능) m은 테이블 컬럼이 아닌 Member 엔티티다.
TypeQuery, Query
• TypeQuery: 반환 타입이 명확할 때 사용한다.
• Query: 반환 타입이 명확하지 않을 때 사용한다.
TypedQuery<Member> query =
em.createQuery("SELECT m FROM Member m", Member.class);
Query query =
em.createQuery("SELECT m.username, m.age from Member m");
TypedQuery는 타입이 명확하므로, 지네릭스로 Member가 박혀있다.
타입 정보(name은 String, age는 int)를 확정할 수 없는 경우, 타입을 적을 수 없다. 이 때는 Query를 사용한다.
결과 조회 API
• query.getResultList(): 결과가 하나 이상일 때, 리스트를 반환한다.
• 결과가 없으면 빈 리스트 반환한다! Exception이 터지지 않는다.
• query.getSingleResult(): 결과가 정확히 하나일 때, 단일 객체를 반환한다.
• 결과가 없으면: javax.persistence.NoResultException
• 둘 이상이면: javax.persistence.NonUniqueResultException
'JPA 기초' 카테고리의 다른 글
JPQL 페이징 쿼리 & 서브쿼리, 조건식, 기본 함수 (0) | 2022.03.29 |
---|---|
JPQL 파라미터 바인딩, 프로젝션 (0) | 2022.03.28 |
JPA의 데이터 타입 - 값 타입, 엔티티 타입(4) (0) | 2022.03.26 |
JPA의 데이터 타입 - 값 타입, 엔티티 타입(3) (0) | 2022.03.26 |
JPA의 데이터 타입 - 값 타입, 엔티티 타입(2) (0) | 2022.03.26 |