2007/01/27 16:58
Hibernate 기초 학습[29] - HQL : list() vs iterate() vs. scroll()
2007/01/27 16:58 in Hibernate 지식 공유하기/Hibernate_Basic

1. iterator()
list()와 같은 데이터를 리턴하지만, 결과 값의 반환 전략이 list()와는 다르다.
위 코드의 의미는 아래와 같은 쿼리를 실행해서 해당하는 모든 엔티티를 메모리로 불러들이는 것이다.
하지만 여기서 persistence context나 2차 캐시에 이미 같은 엔티티에 대한 정보가 있다면?
동일한 엔티티 정보가 이미 저장되어 있다면, 다시 모든 정보를 데이터베이스에서 가져오기 보다는 이미 불러온 데이터에서 내가 원한 엔티티가 맞는지를 식별하고, 동일한 엔티티가 있는 경우에는 사용하면 되겠다.
결국 반드시 데이터베이스에서 가져와야 하는 정보는 엔티티를 식별하기 위한 주키 정보밖에 없다.
select id from user where id = ?
이번에는 iterate()로 불어왔다.
이때 iterate()는 해당 엔티티들의 주키만을 가져온다. 여기서는 User class의 주키에 해당하는 정보만 가져오는 것이다. persistence context와 2차 캐시에서 주키와 일치하는 엔티티가 있는 경우에는 그 엔티티를 사용하고, 없는 경우에는 다시 추가적인 SELECT문을 내부적으로 수행하여, 엔티티에 대한 모든 정보를 가져오게 된다.
한 번 열린 iterator는 쿼리로 받아온 결과값에 iteration 작업이 끝나거나 세션이 만료될 때까지 열려있게 된다.
혹은 명시적으로 org.hibernate.Hibernate.close(iterator)를 실행해서 iterator를 닫을 수 있다.
2. scroll()
일반적인 jdbc에서도 scrollable resultset에서 cursor를 사용해서 reslutset 중에 특정한 행을 핸들링할 수가 있다. 마찬가지로 하이버네이트에서도 이 방법을 사용해서 결과값 리스트 중에서 특정 행만을 핸들링하는 방법을 제공한다.
하이버네이트에서는 ScrollableResults(Interface)를 사용한다.
주요 메소드로는
ScrollableResults에서는 ScrollMode 클래스에 정의되어 있는 상수를 사용해서 몇 가지 옵션을 설정할 수가 있다.
list()와 같은 데이터를 리턴하지만, 결과 값의 반환 전략이 list()와는 다르다.
Query query = session.createQuery("from User where id = :id").setString("id", usr_id);
List user = query.list();
List user = query.list();
위 코드의 의미는 아래와 같은 쿼리를 실행해서 해당하는 모든 엔티티를 메모리로 불러들이는 것이다.
select id, name, address, alias, passwd from user where id = ?
하지만 여기서 persistence context나 2차 캐시에 이미 같은 엔티티에 대한 정보가 있다면?
동일한 엔티티 정보가 이미 저장되어 있다면, 다시 모든 정보를 데이터베이스에서 가져오기 보다는 이미 불러온 데이터에서 내가 원한 엔티티가 맞는지를 식별하고, 동일한 엔티티가 있는 경우에는 사용하면 되겠다.
결국 반드시 데이터베이스에서 가져와야 하는 정보는 엔티티를 식별하기 위한 주키 정보밖에 없다.
select id from user where id = ?
Query query = session.createQuery("from User where id = :id").setString("id", usr_id);
List user = query.iterate();
List user = query.iterate();
이번에는 iterate()로 불어왔다.
이때 iterate()는 해당 엔티티들의 주키만을 가져온다. 여기서는 User class의 주키에 해당하는 정보만 가져오는 것이다. persistence context와 2차 캐시에서 주키와 일치하는 엔티티가 있는 경우에는 그 엔티티를 사용하고, 없는 경우에는 다시 추가적인 SELECT문을 내부적으로 수행하여, 엔티티에 대한 모든 정보를 가져오게 된다.
한 번 열린 iterator는 쿼리로 받아온 결과값에 iteration 작업이 끝나거나 세션이 만료될 때까지 열려있게 된다.
혹은 명시적으로 org.hibernate.Hibernate.close(iterator)를 실행해서 iterator를 닫을 수 있다.
2. scroll()
일반적인 jdbc에서도 scrollable resultset에서 cursor를 사용해서 reslutset 중에 특정한 행을 핸들링할 수가 있다. 마찬가지로 하이버네이트에서도 이 방법을 사용해서 결과값 리스트 중에서 특정 행만을 핸들링하는 방법을 제공한다.
하이버네이트에서는 ScrollableResults(Interface)를 사용한다.
주요 메소드로는
get() - Get the current row of results
first() - Go to the first result
last() - Go to the las result
next() - Advance to the next result
previous() - Repeat to the previous result
scroll(int i) - Scroll an arbitrary number of locations
first() - Go to the first result
last() - Go to the las result
next() - Advance to the next result
previous() - Repeat to the previous result
scroll(int i) - Scroll an arbitrary number of locations
ScrollableResults에서는 ScrollMode 클래스에 정의되어 있는 상수를 사용해서 몇 가지 옵션을 설정할 수가 있다.
ScrollMode.FORWARD_ONLY : 앞으로만 iteration 가능
ScrollMode.SCROLL_INSENSITIVE : cursor가 열려 있는 동안에는 수정금지
ScrollMode.SCROLL_SENSITIVE : 반대
ScrollMode.SCROLL_INSENSITIVE : cursor가 열려 있는 동안에는 수정금지
ScrollMode.SCROLL_SENSITIVE : 반대



Prev
Rss Feed


