/* * Copyright 2011-2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package kr.debop4j.data.ogm.dao; import kr.debop4j.core.collection.IPagedList; import org.apache.lucene.search.Query; import org.apache.lucene.search.Sort; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.search.FullTextQuery; import org.hibernate.search.FullTextSession; import org.hibernate.search.query.dsl.QueryBuilder; import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.concurrent.Future; /** * Data Access Object for Hibernate-OGM * Hibernate-OGM 용의 조회는 hibernate-search와 lucene 을 이용하고, * CUD는 hibernate-core 와 같다. * * @author 배성혁 sunghyouk.bae@gmail.com * @since 13. 5. 31. 오후 10:31 */ public interface IHibernateOgmDao { // /** IHibernateOgmDao에서 사용할 hibernate Session 을 thread local 에 저장할 때의 키 값 */ // String SESSION_KEY = IHibernateOgmDao.class.getName() + ".Session"; /** IHibernateOgmDao에서 사용할 hibernate-search FullTextSession 을 thread local 에 저장할 때의 키 값 */ String FULL_TEXT_SESSION_KEY = IHibernateOgmDao.class.getName() + ".FullTextSession"; /** 기본 Batch size (1000) */ int DEFAUALT_BATCH_SIZE = 1000; /** 현 Thread-context 에서 사용할 Session 를 빈환합니다. */ Session getSession(); /** 현 Thread-context 에서 사용할 hibernate-search 의 {@link org.hibernate.search.FullTextSession} 을 반환합니다. */ FullTextSession getFullTextSession(); /** * 지정한 형식에 대한 질의 빌더를 생성합니다. * * @param clazz 엔티티 수형 * @return 쿼리 빌더 */ QueryBuilder getQueryBuilder(Class<?> clazz); /** * lucene 을 이용한 full text search 를 위한 {@link org.hibernate.search.FullTextQuery}를 반환합니다. * * @param luceneQuery 조회용 루씬 쿼리 * @param entities 대상 엔티티 수형들 * @return FullTextQuery 인스턴스 */ FullTextQuery getFullTextQuery(Query luceneQuery, Class<?>... entities); /** * 해당 Id 값을 가진 엔티티를 조회합니다. 없으면 null을 반환합니다. * * @param clazz 조회할 엔티티 수형 * @param id 조회할 엔티티의 Id 값 * @return 해당 엔티티, 없으면 null을 반환 */ <T> T get(Class<T> clazz, Serializable id); /** * 지정한 엔티티에 조회를 수행합니다. * * @param clazz 조회할 엔티티 수형 * @return 전체 엔티티 */ <T> List<T> find(Class<T> clazz); /** * 지정한 엔티티에 조회를 수행합니다. * * @param clazz 조회할 엔티티 수형 * @param luceneQuery 루씬 쿼리 * @return 조회한 결과 엔티티 컬렉션 */ <T> List<T> find(Class<T> clazz, Query luceneQuery); /** * 지정한 엔티티에 조회를 수행합니다. * * @param clazz 조회할 엔티티 수형 * @param luceneQuery 루씬 쿼리 * @param luceneSort 정렬 방식 * @return 조회한 결과 엔티티 컬렉션 */ <T> List<T> find(Class<T> clazz, Query luceneQuery, Sort luceneSort); /** * 엔티티 조회를 수행합니다. * * @param clazz 엔티티 수형 * @param luceneQuery 루씬 쿼리 * @param firstResult 첫번재 결과 (0부터 시작) * @param maxResults 최대 결과 수 * @param luceneSort 정렬 방식 * @return 조회 결과 */ <T> List<T> find(Class<T> clazz, Query luceneQuery, int firstResult, int maxResults, Sort luceneSort); /** * 엔티티 조회를 수행합니다. * * @param clazz 엔티티 수형 * @param luceneQuery 루씬 쿼리 * @param firstResult 첫번재 결과 (0부터 시작) * @param maxResults 최대 결과 수 * @param luceneSort 정렬 방식 * @param criteria association이 있는 경우 join 방식을 변경할 수 있다. * @return 조회 결과 */ <T> List<T> find(Class<T> clazz, Query luceneQuery, int firstResult, int maxResults, Sort luceneSort, Criteria criteria); /** * 검색할 엔티티의 ID 값만 조회합니다 (많은 경우 ID만 필요한 경우가 많습니다) * * @param clazz 조회할 ID * @param luceneQuery 루씬 쿼리 * @return 조회한 엔티티의 ID의 컬렉션 */ List<Serializable> findIds(Class<?> clazz, Query luceneQuery); /** * 검색할 엔티티의 ID 값만 조회합니다 (많은 경우 ID만 필요한 경우가 많습니다) * * @param clazz 조회할 ID * @param luceneQuery 루씬 쿼리 * @param firstResult 첫번째 결과 인덱스 (0부터 시작) * @param maxResults 최대 결과 갯수 * @param luceneSort 루씬 정렬 방식 * @return 조회한 엔티티의 ID의 컬렉션 */ List<Serializable> findIds(Class<?> clazz, Query luceneQuery, int firstResult, int maxResults, Sort luceneSort); /** * 검색할 엔티티의 ID 값만 조회합니다 (많은 경우 ID만 필요한 경우가 많습니다) * * @param clazz 조회할 ID * @param luceneQuery 루씬 쿼리 * @param firstResult 첫번째 결과 인덱스 (0부터 시작) * @param maxResults 최대 결과 갯수 * @param luceneSort 루씬 정렬 방식 * @param criteria fetching 방식 등 * @return 조회한 엔티티의 ID의 컬렉션 */ List<Serializable> findIds(Class<?> clazz, Query luceneQuery, int firstResult, int maxResults, Sort luceneSort, Criteria criteria); /** * 엔티티 조회 시에 특정 정보만을 가져온다. fields 값에는 {@link org.hibernate.search.ProjectionConstants} 를 쓸 수 있습니다. * * @param clazz 조회할 엔티티 수형 * @param luceneQuery 루씬 쿼리 * @param fields Projection 필드들 ({@link org.hibernate.search.ProjectionConstants}) * @return Projection 값 */ List<Object[]> findProjections(Class<?> clazz, Query luceneQuery, String[] fields); /** * 엔티티 조회 시에 특정 정보만을 가져온다. fields 값에는 {@link org.hibernate.search.ProjectionConstants} 를 쓸 수 있습니다. * * @param clazz 조회할 엔티티 수형 * @param luceneQuery 루씬 쿼리 * @param fields Projection 필드들 ({@link org.hibernate.search.ProjectionConstants}) * @param luceneSort 루씬 정렬 방식 * @return Projection 값 */ List<Object[]> findProjections(Class<?> clazz, Query luceneQuery, String[] fields, Sort luceneSort); /** * 엔티티 조회 시에 특정 정보만을 가져온다. fields 값에는 {@link org.hibernate.search.ProjectionConstants} 를 쓸 수 있습니다. * * @param clazz 조회할 엔티티 수형 * @param luceneQuery 루씬 쿼리 * @param fields Projection 필드들 ({@link org.hibernate.search.ProjectionConstants}) * @param luceneSort 루씬 정렬 방식 * @param criteria Fetching 등 기존 association외의 fetching을 정의할 수 있다. * @return Projection 값 */ List<Object[]> findProjections(Class<?> clazz, Query luceneQuery, String[] fields, Sort luceneSort, Criteria criteria); /** * 엔티티 조회 시에 특정 정보만을 가져온다. fields 값에는 {@link org.hibernate.search.ProjectionConstants} 를 쓸 수 있습니다. * * @param clazz 조회할 엔티티 수형 * @param luceneQuery 루씬 쿼리 * @param fields Projection 필드들 ({@link org.hibernate.search.ProjectionConstants}) * @param firstResult 첫번째 결과 인덱스 (0부터 시작) * @param maxResults 최대 결과 갯수 * @param luceneSort 루씬 정렬 방식 * @param criteria Fetching 등 기존 association외의 fetching을 정의할 수 있다. * @return Projection 값 */ List<Object[]> findProjections(Class<?> clazz, Query luceneQuery, String[] fields, int firstResult, int maxResults, Sort luceneSort, Criteria criteria); /** * 페이징 조회를 수행합니다. * * @param clazz 조회할 엔티티 수형 * @param luceneQuery 루씬 조회 쿼리 * @param pageNo 페이지 번호 (1부터 시작) * @param pageSize 페이지 크기 (보통 10) * @return 검색 결과를 페이징 결과로 반환합니다. */ <T> IPagedList<T> getPage(Class<T> clazz, Query luceneQuery, int pageNo, int pageSize); /** * 페이징 조회를 수행합니다. * * @param clazz 조회할 엔티티 수형 * @param luceneQuery 루씬 조회 쿼리 * @param pageNo 페이지 번호 (1부터 시작) * @param pageSize 페이지 크기 (보통 10) * @param luceneSort 정렬 방식 * @return 검색 결과를 페이징 결과로 반환합니다. */ <T> IPagedList<T> getPage(Class<T> clazz, Query luceneQuery, int pageNo, int pageSize, Sort luceneSort); /** * 페이징 조회를 수행합니다. * * @param clazz 조회할 엔티티 수형 * @param luceneQuery 루씬 조회 쿼리 * @param pageNo 페이지 번호 (1부터 시작) * @param pageSize 페이지 크기 (보통 10) * @param luceneSort 정렬 방식 * @param criteria association이 있는 경우 fetching 방식을 변경할 수 있습니다. * @return 검색 결과를 페이징 결과로 반환합니다. */ <T> IPagedList<T> getPage(Class<T> clazz, Query luceneQuery, int pageNo, int pageSize, Sort luceneSort, Criteria criteria); /** * 엔티티의 ID 값만 조회하여 Paging 처리해서 반환합니다. * * @param clazz 조회할 엔티티 수형 * @param luceneQuery 루씬 쿼리 * @param pageNo 페이지 번호 (1부터 시작) * @param pageSize 페이지 크기 (보통 10 이상) * @return 엔테티의 Id 값을 Paging 처리한 인스턴스 */ IPagedList<Serializable> getIdPage(Class<?> clazz, Query luceneQuery, int pageNo, int pageSize); /** * 엔티티의 ID 값만 조회하여 Paging 처리해서 반환합니다. * * @param clazz 조회할 엔티티 수형 * @param luceneQuery 루씬 쿼리 * @param pageNo 페이지 번호 (1부터 시작) * @param pageSize 페이지 크기 (보통 10 이상) * @param luceneSort 정렬 방식 * @return 엔테티의 Id 값을 Paging 처리한 인스턴스 */ IPagedList<Serializable> getIdPage(Class<?> clazz, Query luceneQuery, int pageNo, int pageSize, Sort luceneSort); /** * 엔티티의 ID 값만 조회하여 Paging 처리해서 반환합니다. * * @param clazz 조회할 엔티티 수형 * @param luceneQuery 루씬 쿼리 * @param pageNo 페이지 번호 (1부터 시작) * @param pageSize 페이지 크기 (보통 10 이상) * @param luceneSort 정렬 방식 * @param criteria fetching 등 방식을 제공 * @return 엔테티의 Id 값을 Paging 처리한 인스턴스 */ IPagedList<Serializable> getIdPage(Class<?> clazz, Query luceneQuery, int pageNo, int pageSize, Sort luceneSort, Criteria criteria); /** * 루씬 부가 정보등을 페이징 조회합니다. * <p/> * 참고 : {@link org.hibernate.search.ProjectionConstants#ID}, * {@link org.hibernate.search.ProjectionConstants#SCORE} 등 * * @param clazz 조회할 엔티티 수형 * @param luceneQuery 루씬 쿼리 * @param fields 조회할 필드 * @param pageNo 페이지 번호 (1부터 시작) * @param pageSize 페이지 크기 (보통 10 이상) * @return Projection 정보 */ IPagedList<Object[]> getProjectionPage(Class<?> clazz, Query luceneQuery, String[] fields, int pageNo, int pageSize); /** * 루씬 부가 정보등을 페이징 조회합니다. * <p/> * 참고 : {@link org.hibernate.search.ProjectionConstants#ID}, * {@link org.hibernate.search.ProjectionConstants#SCORE} 등 * * @param clazz 조회할 엔티티 수형 * @param luceneQuery 루씬 쿼리 * @param fields 조회할 필드 * @param pageNo 페이지 번호 (1부터 시작) * @param pageSize 페이지 크기 (보통 10 이상) * @param luceneSort 루씬 정렬 방식 * @return Projection 정보 */ IPagedList<Object[]> getProjectionPage(Class<?> clazz, Query luceneQuery, String[] fields, int pageNo, int pageSize, Sort luceneSort); /** * 루씬 부가 정보등을 페이징 조회합니다. * <p/> * 참고 : {@link org.hibernate.search.ProjectionConstants#ID}, * {@link org.hibernate.search.ProjectionConstants#SCORE} 등 * * @param clazz 조회할 엔티티 수형 * @param luceneQuery 루씬 쿼리 * @param fields 조회할 필드 * @param pageNo 페이지 번호 (1부터 시작) * @param pageSize 페이지 크기 (보통 10 이상) * @param luceneSort 루씬 정렬 방식 * @param criteria fetching 방식 * @return Projection 정보 */ IPagedList<Object[]> getProjectionPage(Class<?> clazz, Query luceneQuery, String[] fields, int pageNo, int pageSize, Sort luceneSort, Criteria criteria); /** * 조회 조건에 맞는 엔티티의 갯수를 반환합니다. * * @param clazz 엔티티 수형 * @return 조건에 맞는 엔티티의 갯수 */ long count(Class<?> clazz); /** * 조회 조건에 맞는 엔티티의 갯수를 반환합니다. * * @param clazz 엔티티 수형 * @param luceneQuery 루씬 쿼리 * @return 조건에 맞는 엔티티의 갯수 */ long count(Class<?> clazz, Query luceneQuery); /** * 조회 조건에 맞는 엔티티의 갯수를 반환합니다. * * @param clazz 엔티티 수형 * @param luceneQuery 루씬 쿼리 * @param criteria fetching 방식 * @return 조건에 맞는 엔티티의 갯수 */ long count(Class<?> clazz, Query luceneQuery, Criteria criteria); /** * 엔티티가 있는지 확인합니다. * * @param clazz 엔티티의 수형 * @return 존재 여부 */ boolean exists(Class<?> clazz); /** * 조회 조건에 해당하는 엔티티가 있는지 확인합니다. * * @param clazz 엔티티의 수형 * @param luceneQuery 루씬 쿼리 * @return 존재 여부 */ boolean exists(Class<?> clazz, Query luceneQuery); /** * transient Object를 저장합니다. cascading은 cascade="persist" 인 경우에 적용됩니다. * * @param entity 저장할 transient object */ void persist(Object entity); /** * 엔티티를 session에 추가합니다. 저장된 엔티티라면, 기존 엔티티의 값을 해당 엔티티의 속성 값으로 update 합니다. * * @param entity 엔티티 * @return update된 엔티티 */ Object merge(Object entity); /** * transient object 를 저장합니다. cascading은 cascade="save-update" 인 경우에 적용됩니다. * * @param entity 저장할 transient object * @return 저장한 object의 ideneifier 값 */ Serializable save(Object entity); /** * transient object 라면 save하고, persistent object 라면 update 합니다. * * @param entity 저장할 엔티티 */ void saveOrUpdate(Object entity); /** * 엔티티의 정보를 갱신합니다. * * @param entity persistent object */ void update(Object entity); /** * 엔티티를 삭제합니다. * * @param entity 삭제할 엔티티 */ void delete(Object entity); /** * 해당 Id 값을 가지는 엔티티를 삭제합니다. * * @param clazz 삭제할 엔티티의 수형 * @param id Identifier 값 */ void deleteById(Class<?> clazz, Serializable id); /** * Id 컬렉션에 해당하는 엔티티를 모두 삭제합니다. * * @param clazz 삭제할 엔티티의 수형 * @param ids 삭제할 엔티티의 Identifier 값들 */ void deleteByIds(Class<?> clazz, Collection<? extends Serializable> ids); /** * 해당 수형의 모든 엔티티 정보를 삭제합니다. * * @param clazz 삭제할 엔티티 */ void deleteAll(Class<?> clazz); /** * 조회 조건에 해당하는 엔티티들을 모두 삭제합니다. * * @param clazz 삭제할 엔티티 * @param luceneQuery 루씬 쿼리 */ void deleteAll(Class<?> clazz, Query luceneQuery); /** * 모든 엔티티들을 삭제합니다. * * @param entities 삭제할 엔티티 컬렉션 */ void deleteAll(Collection<?> entities); /** * 해당 엔티티의 인덱스 정보를 제거합니다. * * @param clazz 엔티티 수형 * @param id 엔티티의 id 값 */ void purge(Class<?> clazz, Serializable id); /** * 지정된 수형의 모든 엔티티들의 인덱스 정보를 제거합니다. * * @param clazz 해당 엔티티의 수형 */ void purgeAll(Class<?> clazz); /** Session에 남아있는 인덱싱 작업을 강제로 수행하도록 합니다. */ void flushToIndexes(); /** * 엔티티를 수동으로 재 인덱싱합니다.<br/> * Force the (re)indexing of a given <b>managed</b> object. * * @param entity 재인덱싱할 엔티티 */ <T> void index(T entity); /** * 지정된 수형의 모든 엔티티들을 인덱싱 합니다. * * @param clazz 인덱싱할 엔티티 * @param batchSize 배치 크기 */ void indexAll(Class<?> clazz, int batchSize); /** * 해당 수형의 모든 인덱스를 비동기 방식으로 구성합니다. * * @param clazz 엔티티 수형 * @param batchSize Batch 크기 (작은 크기로 나눠서 인덱싱을 수행하여, 메모리를 절약합니다.) * @return {@link Future} */ Future<Void> indexAllAsync(Class<?> clazz, int batchSize); /** * 해당 수형의 모든 인덱스 정보를 삭제합니다. * * @param clazz 엔티티 수형 */ void clearIndex(Class<?> clazz); /** 모든 인덱스를 삭제합니다. */ void clearIndexAll(); /** * 해당 엔티티의 인덱스를 최적화합니다. * * @param clazz 최적화할 엔티티의 수형 */ void optimize(Class<?> clazz); /** 모든 엔티티의 인덱스를 최적화합니다. */ void optimizeAll(); /** 세션의 모든 변경을 저장소에 적용한다. */ void flush(); /** 세션의 모든 인덱스 변경 정보를 저장합니다. */ void flushIndexes(); }