개발강의정리/Spring

[스프링 데이터 JPA] 2-4. JPA 프로그래밍 7: Query

nineDeveloper 2019. 11. 22.
728x90

스프링 데이터 JPA

2. 핵심 개념 이해

본격적인 스프링 데이터 JPA 활용법을 학습하기에 앞서, ORM과 JPA에 대한 이론적인 배경을 학습합니다

포스팅 참조 정보

GitHub

공부한 내용은 GitHub에 공부용 Organizations에 정리 하고 있습니다

해당 포스팅에 대한 내용의 GitHub 주소

실습 내용이나 자세한 소스코드는 GitHub에 있습니다
포스팅 내용은 간략하게 추린 핵심 내용만 포스팅되어 있습니다

https://github.com/freespringlecture/spring-data-jpa-study/tree/chap02-04-07_query

해당 포스팅 참고 인프런 강의

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-jpa/dashboard

실습 환경

  • Java Version: Java 11
  • SpringBoot Version: 2.1.2.RELEASE

4. JPA 프로그래밍 7: Query

JPA, Hibernate를 사용할 때는 항상 무슨 Query를 발생시키는지 그게 의도한 것인지 확인해야됨

JPQL (HQL)

  • Java Persistence Query Language / Hibernate Query Language
  • 데이터베이스 테이블이 아닌, 엔티티 객체 모델 기반으로 쿼리 작성
  • JPA 또는 하이버네이트가 해당 쿼리를 SQL로 변환해서 실행함

https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#hql

JPQL 예시

Post는 테이블 이름이 아니라 Entity 이름
JPA 2.0 부터는 Type을 지정할 수 있고 지정한 Type의 리스트로 출력이 됨
이전에는 Object Type으로 나와서 다 변환해줘야됐었음

Post에 title toString 추가

@Override
public String toString() {
    return "Post{" +
            "title='" + title + '\'' +
            '}';
}

JpaRunner에서 테스트 로직 구현

TypedQuery<Post> query = entityManager.​createQuery​("SELECT p FROM Post As p", Post.class);
List<Post> posts = query.getResultList();
posts.forEach(System.out::println);

Criteria

https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#criteria

타입 세이프 쿼리

CriteriaBuilder builder = entityManager.​getCriteriaBuilder​();
CriteriaQuery<Post> criteria = builder.createQuery(Post.class);
Root<Post> root = criteria.from(Post.class);
criteria.select(root);
List<Post> posts = entityManager.​createQuery​(criteria).getResultList();

Native Query

https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#sql

Typed 메서드가 아니더라도 지정한 Type으로 결과값을 리턴해줌

SQL 쿼리 실행하기

List<Post> posts = entityManager
                .createNativeQuery("SELECT * FROM Post", Post.class)
                .getResultList();
728x90

댓글

💲 추천 글