프로젝트 git url | github.com/rtef23/JpaStudy |
필요 | 1. docker 2. docker-compose |
프로젝트 정보 | mysql : 5.7 - docker image java : 1.8 |
JPA에서 지원하는 쿼리 방법
- JPQL(Java Persistence Query Language)
- JPA Criteria
- QueryDSL
- native SQL
- JDBC API 직접 사용, MyBatis, SpringJdbcTemplate과 함께 사용
JPQL
- JPA에서 SQL을 추상화한 객체 지향 쿼리 언어
- SQL 문법과 유사(Select, From, Where, Group by, Having, Join 지원)
- JPQL은 엔티티 객체를 대상으로 쿼리
- SQL은 데이터 베이스 테이블을 대상으로 쿼리
- 문자열 기반의 객체 지향 쿼리 작성 방법
List<Member> members =
entityManager
.createQuery("select m from Member m where m.name like '%test%'", Member.class)
.getResultList();
- 일반적인 SQL과는 다르게 select * ~가 아닌 Member 엔티티를 대상으로 조회 쿼리를 작성하게 된다.
JPA Criteria
- JPQ에서 동적 쿼리 지원을 수월하도록 지원하도록 하는 방법
- 문자열이 아닌 자바 코드로 JPQL을 작성할 수 있음
- 컴파일 시점에서 쿼리 오류를 어느 정도 해소 가능
- 한눈에 SQL을 파악하기 어려움
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Member> query = criteriaBuilder.createQuery(Member.class);
//루트 클래스 (조회를 시작할 클래스)
Root<Member> memberRoot = query.from(Member.class);
//쿼리 생성
CriteriaQuery<Member> selectQuery =
query.select(memberRoot).where(criteriaBuilder.like(memberRoot.get("name"), "test"));
//쿼리 실행
List<Member> findMembers = entityManager.createQuery(selectQuery).getResultList();
QueryDSL
- 오픈 소스 라이브러리
- JPQL 빌더 역할
- 동적 쿼리 작성 편리
- 사용하기 위해서는 QueryDSL 설정 필요
//[JPQL] select m from Member m where m.age > 18 order by name DESC
JPAFactoryQuery query = new JPAQueryFactory(entityManager);
QMember member = QMember.member;
List<Member> findMembers = query
.selectFrom(member)
.where(m.age.gt(18))
.orderBy(m.name.desc)
.fetch();
native SQL
- JPA가 SQL을 직접 사용할 수 있도록 제공하는 기능
- JPQL로 해결할 수 없는 특정 데이터베이스에 의존적인 기능
- example) oracle DB - Connect By, 특정 DB에서 사용하는 힌트
String sql = "select member_id, name from Member where name like '%test%'";
List<Member> findMembers1 = entityManager.createNativeQuery(sql, Member.class).getResultList();
JDBC 직접 사용, SpringJdbcTemplate, ...
- JPA를 사용하면서 JDBC 커넥션을 직접 사용하거나, SpringJdbcTemplate, MyBatis 등을 함께 사용 가능
- 단, 영속성 컨텍스트를 적절한 시점에 flush 호출이 필요함
- JPQL을 우회해서 SQL을 실행하기 직전에 영속성 컨텍스트 flush API 호출이 필요하다.
'JPA' 카테고리의 다른 글
[JPA] 22. JPQL - 기본 문법 2 (0) | 2021.01.27 |
---|---|
[JPA] 21. JPQL - 기본 문법 1 (0) | 2021.01.26 |
[JPA] 19. 값 타입 컬렉션 (0) | 2021.01.23 |
[JPA] 18. 값 타입 - 불변 객체 (0) | 2021.01.21 |
[JPA] 17. 값 타입 (0) | 2021.01.21 |