2.1 쿼리 클래스 소개

그런데 또 다른 중요한 점은 쿼리 도우미 클래스입니다. 이 예에서 볼 수 있습니다.

public List<Employee> getAllEmployes() {
    try (Session session = sessionFactory.openSession()) {
            Query<Employee> query = session.createQuery("from Employee", Employee.class);
            return query.list();
    }
}

실제로 Query는 인터페이스이며 다양한 경우에 대한 여러 구현이 있습니다. 그러나 간단하게 하기 위해 계속해서 클래스라고 부르겠습니다. 이것은 OOP 측면에서 넓은 의미의 클래스입니다.

메모. 이전에는 두 개의 클래스가 있었습니다.

  • 쿼리를 설명하는 쿼리입니다 .
  • 알려진 유형의 쿼리를 설명하는 TypedQuery .

첫 번째는 Hibernate가 이미 존재하고 제네릭이 아직 없을 때 나타났습니다. 그런 다음 JDK 5 릴리스 이후 Hibernate - TypedQuery에 이미 쿼리 결과의 타이핑을 지원하는 또 다른 클래스가 추가되었습니다.

하지만 내가 기억하는 한, Hibernate 5번째 버전부터 Typed 클래스가 하나만 남았고 이제 Query라고 합니다.

쿼리를 만드는 표준 방법은 다음과 같습니다.


Query<Employee> query = session.createQuery("from Employee", Employee.class);

쿼리 개체를 만드는 방법을 배웠지만 이러한 쿼리를 어떻게 실행합니까?

여기서는 훨씬 더 간단합니다. Query 개체에서 list() 메서드를 호출하기만 하면 됩니다.


Query<Employee> query = session.createQuery("from Employee", Employee.class);
List<Employee> resultLіst = query.list();

list() 메서드에는 동일한 작업을 수행하지만 getResultList() 라고 하는 메서드인 JPA 동의어가 있습니다 . 다른 프로그래머가 작성한 코드에서 가끔 볼 수 있습니다.

그런데 쿼리가 결과가 단일 결과에 있음을 암시하는 경우 uniqueResult() 메서드를 사용하여 쿼리를 호출하는 것이 더 쉽습니다 .


Query<Employee> query = session.createQuery("from Employee where id = 1", Employee.class);
Employee result = query.uniqueResult();

uniqueResult() 메서드에는 JPA 동의어인 singleResult() 메서드가 있습니다 . JPA 표준과 Hibernate의 호환성을 위해 도입되었습니다. 그는 똑같은 일을 합니다.

2.2 쿼리 클래스 메서드

실제로 Query 클래스에는 다양한 메서드가 있습니다. 아래에서 나는 그들 중 세 가지에 대해 더 이야기 할 것입니다.

첫 번째는 stream() 메서드입니다 . 그리고 JPA 동의어 getResultStream() 입니다 .

이 두 메서드는 모두 목록 대신 데이터 스트림을 반환합니다. 이 접근 방식은 쿼리 결과로 얻은 모든 개체가 한 번에 필요하지 않은 경우 매우 효율적일 수 있습니다. 또는 그들 중 첫 번째만 사용될 가능성이 있습니다.

예:


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
Stream<Employee> stream = query.stream();

두 번째 방법은 executeUpdate() 방법입니다 . 데이터베이스에서 무언가를 변경하는 쿼리를 작성할 수 있습니다. 이 경우 Hibernate는 데이터베이스에 접근할 때 읽기 전용 트랜잭션을 사용하지 않을 필요가 있다.

요청 예: 모든 사용자의 레벨을 1 올리기로 했습니다.


Query<User> query = session.createQuery("update User set level=level+1", User.class);
int count = query.executeUpdate();

executeUpdate() 메서드는 실제로 수정된 행 수를 반환합니다.

마지막으로 세 번째 방법은 scroll() 입니다 . 그것에 대해 조금 더 알려 드리겠습니다.

2.3 스크롤 클래스 메서드

이 메서드는 stream() 메서드 와 다소 유사합니다 . 결과를 전혀 꺼내지 않고 결과 목록을 이동할 수 있습니다. 즉, 쿼리를 실행한 다음 결과의 백만 번째 줄로 스크롤하고 거기에서 데이터 읽기를 시작할 수 있습니다.

이러한 고급 반복자입니다.


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();

ScrollableResults 개체에는 다음 메서드가 있습니다.

방법 설명
아르바이트() 현재 요소를 반환
다음() 포인터를 다음 요소로 이동
이전의() 포인터를 이전 요소 로 이동
스크롤(정수 크기) 크기 선을 기준으로 앞으로 스크롤
위치(정수 위치) 요소 위치 번호를 현재 요소로 만듭니다.
마지막() 현재 요소는 이제 마지막 요소 입니다.
첫 번째() 현재 요소는 이제 첫 번째 요소 입니다.
getRowNumber() 현재 줄 번호를 반환
setRowNumber() 현재 줄 번호 설정

쿼리를 실행했고 마지막 요소를 가져오고 싶다고 가정해 보겠습니다. 방법은 다음과 같습니다.


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();
scroll.last();
Employee lastEmployee = scroll.get();