ABOUT ME

-

오늘
-
어제
-
-
  • JPA - Query(쿼리)
    Back-end/JPA 2020. 6. 30. 16:59

    Query

    JPA, Hibernate를 사용할 때는 항상 무슨 쿼리를 발생시키는지 그게 의도한 것인지 확인해야합니다. 이런 쿼리를 어떻게 적용시키는지 알아보는 시간을 가지겠습니다.

    JPQL (HQL)

    • 데이터베이스 테이블이 아닌, 엔티티 객체 모델 기반으로 쿼리를 작성합니다.
    • JPA 또는 하이버네이트가 해당 쿼리를 SQL로 변환해서 실행합니다.
    • 참고자료 : 하이버네이트 공식문서

    Post 클래스 title toString 추가

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

    title만 포함된 toString을 만듭니다.

    JpaRunner 클래스

        @Override
        public void run(ApplicationArguments args) throws Exception {
            TypedQuery<Post> query = entityManager.createQuery("SELECT p FROM Post AS p", Post.class);
            List<Post> posts = query.getResultList();
            posts.forEach(System.out::println);
        }

     

    Query

    쿼리에 들어가는 Post는 테이블 이름이 아닌 Entity의 이름입니다.

    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();

    따로 String 문자열의 쿼리를 작성하지 않기 때문에 타입세이프합니다.

    Native Query

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

        @Override
        public void run(ApplicationArguments args) throws Exception {
            List<Post> resultList = entityManager.createNativeQuery("SELECT * FROM Post", Post.class)
                    .getResultList();
            resultList.forEach(System.out::println);
        }

     

    Query

    createNativeQuery에 쿼리문, 클래스를 선언하고 List에 Post 클래스를 담습니다. 그리고 List를 가져와 출력합니다.

    'Back-end > JPA' 카테고리의 다른 글

    JPA - Common Repository  (0) 2020.06.30
    JPA - JPA의 원리  (0) 2020.06.30
    JPA - FETCH  (0) 2020.06.30
    JPA - 엔티티 상태, Cascade  (0) 2020.06.30
    JPA - Relation Mapping(관계 매핑)  (0) 2020.06.30

    댓글