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();
GO TO FULL VERSION