/* * 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.hibernate.repository; import kr.debop4j.core.collection.IPagedList; import kr.debop4j.data.hibernate.HibernateParameter; import kr.debop4j.data.model.IStatefulEntity; import org.hibernate.*; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Example; import org.hibernate.criterion.Order; import org.hibernate.criterion.ProjectionList; import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; import java.util.Collection; import java.util.List; /** * Hibernate 용 Data Access Object Interface 입니다. * * @author 배성혁 ( sunghyouk.bae@gmail.com ) * @since 12. 11. 27. */ @Transactional public interface IHibernateRepository<E extends IStatefulEntity> { Class<E> getEntityClass(); /** * Current thread context 에서 사용하는 Session을 반환합니다. * {@link kr.debop4j.data.hibernate.unitofwork.UnitOfWorks#start} 가 먼저 수행되어 있어야 합니다. * * @return the session */ Session getSession(); /** Session의 변경을 DB에 적용합니다. */ void flushSession(); /** Session의 변경을 Transaction을 이용하여 DB에 적용합니다. */ void transactionalFlush(); /** * 특정 수형의 해당 id 값을 가지는 엔티티를 로드합니다. (실제 로드하는 것이 아니라, proxy로 로드하는 것이다) * 주의: 실제 데이터가 없을 때에는 예외가 발생합니다. */ <E> E load(Serializable id); /** * 특정 수형의 해당 id 값을 가지는 엔티티를 로드합니다. (실제 로드하는 것이 아니라, proxy로 로드하는 것이다) * 주의: 실제 데이터가 없을 때에는 예외가 발생합니다. */ <E> E load(Serializable id, LockOptions lockOptions); /** * 특정 수형의 해당 id 값을 가지는 엔티티를 로드합니다. 없을 때에는 null을 반환합니다. * * @param id identifier 값 * @return 엔티티, 없으면 null */ <E> E get(Serializable id); /** * 특정 수형의 해당 id 값을 가지는 엔티티를 로드합니다. 없을 때에는 null을 반환합니다. * * @param id identifier 값 * @return 엔티티, 없으면 null */ <E> E get(Serializable id, LockOptions lockOptions); /** 특정 수형의 해당 id 들을 가지는 엔티티들을 로드합니다. */ <E> List<E> getIn(Collection<? extends Serializable> ids); /** 특정 수형의 해당 id 들을 가지는 엔티티들을 로드합니다. */ <E> List<E> getIn(Serializable[] ids); /** * 질의의 결과를 {@link ScrollableResults} 로 반환합니다. * * @param dc 질의 정보 * @return {@link ScrollableResults} 인스턴스 */ ScrollableResults getScroll(DetachedCriteria dc); /** * 질의의 결과를 {@link ScrollableResults} 로 반환합니다. * * @param dc 질의 정보 * @param scrollMode the scroll mode * @return 검색 결과 Scollable Resutls */ ScrollableResults getScroll(DetachedCriteria dc, ScrollMode scrollMode); /** * 질의의 결과를 {@link ScrollableResults} 로 반환합니다. * * @param criteria 질의 * @return 검색 결과 Scollable Resutls */ ScrollableResults getScroll(Criteria criteria); /** * 질의의 결과를 {@link ScrollableResults} 로 반환합니다. * * @param criteria 질의 * @param scrollMode scroll mode * @return 검색 결과 Scollable Resutls */ ScrollableResults getScroll(Criteria criteria, ScrollMode scrollMode); /** * 질의의 결과를 {@link ScrollableResults} 로 반환합니다. * * @param query the query * @param parameters the parameters * @return the scroll */ ScrollableResults getScroll(Query query, HibernateParameter... parameters); /** * 질의의 결과를 {@link ScrollableResults} 로 반환합니다. * * @param query the query * @param scrollMode the scroll mode * @param parameters the parameters * @return the scroll */ ScrollableResults getScroll(Query query, ScrollMode scrollMode, HibernateParameter... parameters); /** * 모든 엔티티를 조회합니다. * * @param orders 정렬 * @return 조회한 엔티티의 컬렉션 */ <E> List<E> findAll(Order... orders); /** * 모든 엔티티를 필터링 없이 Paging 처리하여 반환합니다. * * @param firstResult 첫번째 인덱스 (0부터 시작, OFFSET) * @param maxResults 최대 갯수 (LIMITS) * @param orders 정렬 * @return 조회한 엔티티의 컬렉션 */ <E> List<E> findAll(int firstResult, int maxResults, Order... orders); /** * 해당 엔티티에 대한 조회를 수행합니다. * * @param criteria 질의 정보 * @param orders 정렬 * @param <E> 엔티티 수형 * @return 조회한 엔티티의 컬렉션 */ <E> List<E> find(Criteria criteria, Order... orders); /** * 엔티티에 대한 조회를 수행합니다. * * @param criteria 질의 정보 * @param firstResult 첫번째 인덱스 (0부터 시작, OFFSET) * @param maxResults 최대 갯수 (LIMITS) * @param orders 정렬 * @param <E> 엔티티 수형 * @return 조회한 엔티티의 컬렉션 */ <E> List<E> find(Criteria criteria, int firstResult, int maxResults, Order... orders); /** * 엔티티에 대한 조회를 수행합니다. * * @param orders 정렬 * @param <E> 엔티티 수형 * @return 조회한 엔티티의 컬렉션 */ <E> List<E> find(DetachedCriteria dc, Order... orders); /** * 엔티티에 대한 조회를 수행합니다. * * @param dc 질의 정보 * @param firstResult 첫번째 인덱스 (0부터 시작, OFFSET) * @param maxResults 최대 갯수 (LIMITS) * @param orders 정렬 * @param <E> 엔티티 수형 * @return 조회한 엔티티의 컬렉션 */ <E> List<E> find(DetachedCriteria dc, int firstResult, int maxResults, Order... orders); /** * 엔티티에 대한 조회를 수행합니다. * * @param query 질의 정보 * @param parameters hibernate parameters * @param <E> 엔티티 수형 * @return 조회한 엔티티의 컬렉션 */ <E> List<E> find(Query query, HibernateParameter... parameters); /** * 엔티티에 대한 조회를 수행합니다. * * @param query 질의 정보 * @param firstResult 첫번째 인덱스 (0부터 시작, OFFSET) * @param maxResults 최대 갯수 (LIMITS) * @param parameters hibernate parameters * @param <E> 엔티티 수형 * @return 조회한 엔티티의 컬렉션 */ <E> List<E> find(Query query, int firstResult, int maxResults, HibernateParameter... parameters); /** * 엔티티에 대한 조회를 수행합니다. * * @param hql HQL 문자열 * @param parameters hibernate parameters * @param <E> 엔티티 수형 * @return 조회한 엔티티의 컬렉션 */ <E> List<E> find(String hql, HibernateParameter... parameters); /** * 엔티티에 대한 조회를 수행합니다. * * @param hql HQL 문자열 * @param firstResult 첫번째 인덱스 (0부터 시작, OFFSET) * @param maxResults 최대 갯수 (LIMITS) * @param parameters hibernate parameters * @param <E> 엔티티 수형 * @return 조회한 엔티티의 컬렉션 */ <E> List<E> find(String hql, int firstResult, int maxResults, HibernateParameter... parameters); /** * 엔티티에 대한 조회를 수행합니다. * * @param queryName name of Named Query * @param parameters hibernate parameters * @param <E> 엔티티 수형 * @return 조회한 엔티티의 컬렉션 */ <E> List<E> findByNamedQuery(String queryName, HibernateParameter... parameters); /** * 엔티티에 대한 조회를 수행합니다. * * @param queryName name of Named Query * @param firstResult 첫번째 인덱스 (0부터 시작, OFFSET) * @param maxResults 최대 갯수 (LIMITS) * @param parameters hibernate parameters * @param <E> 엔티티 수형 * @return 조회한 엔티티의 컬렉션 */ <E> List<E> findByNamedQuery(String queryName, int firstResult, int maxResults, HibernateParameter... parameters); /** * 엔티티에 대한 조회를 수행합니다. * * @param sqlString SQL String * @param parameters hibernate parameters * @param <E> 엔티티 수형 * @return 조회한 엔티티의 컬렉션 */ <E> List<E> findBySQLString(String sqlString, HibernateParameter... parameters); /** * 엔티티에 대한 조회를 수행합니다. * * @param sqlString SQL String * @param firstResult 첫번째 인덱스 (0부터 시작, OFFSET) * @param maxResults 최대 갯수 (LIMITS) * @param parameters hibernate parameters * @param <E> 엔티티 수형 * @return 조회한 엔티티의 컬렉션 */ <E> List<E> findBySQLString(String sqlString, int firstResult, int maxResults, HibernateParameter... parameters); /** * {@link Example}로 조회를 수행합니다. * * @param example {@link Example} 인스턴스 * @param <E> 엔티티 수형 * @return 조회된 엔티티 컬렉션 */ <E> List<E> findByExample(Example example); /** * 조회 결과를 페이징 처리해서 가져온다. * * @param criteria 질의 정보 * @param pageNo 페이지 번호 (1부터 시작) * @param pageSize 페이지 크기 (보통 10) * @param orders 정렬 방법 * @param <E> 엔티티 수형 * @return 페이징 처리된 조회 결과 */ <E> IPagedList<E> getPage(Criteria criteria, int pageNo, int pageSize, Order... orders); /** * 조회 결과를 페이징 처리해서 가져온다. * * @param dc 질의 정보 * @param pageNo 페이지 번호 (1부터 시작) * @param pageSize 페이지 크기 (보통 10) * @param orders 정렬 방법 * @param <E> 엔티티 수형 * @return 페이징 처리된 조회 결과 */ <E> IPagedList<E> getPage(DetachedCriteria dc, int pageNo, int pageSize, Order... orders); /** * 조회 결과를 페이징 처리해서 가져온다. * * @param query 질의 정보 * @param pageNo 페이지 번호 (1부터 시작) * @param pageSize 페이지 크기 (보통 10) * @param parameters 질의용 인자 정보 * @param <E> 엔티티 수형 * @return 페이징 처리된 조회 결과 */ <E> IPagedList<E> getPage(Query query, int pageNo, int pageSize, HibernateParameter... parameters); /** * 조회 결과를 페이징 처리해서 가져온다. * * @param hql 질의 정보 * @param pageNo 페이지 번호 (1부터 시작) * @param pageSize 페이지 크기 (보통 10) * @param parameters 질의용 인자 정보 * @param <E> 엔티티 수형 * @return 페이징 처리된 조회 결과 */ <E> IPagedList<E> getPageByHql(final String hql, int pageNo, int pageSize, HibernateParameter... parameters); /** * 조회 결과를 페이징 처리해서 가져온다. * * @param queryName 쿼리 명 * @param pageNo 페이지 번호 (1부터 시작) * @param pageSize 페이지 크기 (보통 10) * @param parameters 질의용 인자 정보 * @param <E> 엔티티 수형 * @return 페이징 처리된 조회 결과 */ <E> IPagedList<E> getPageByNamedQuery(final String queryName, int pageNo, int pageSize, HibernateParameter... parameters); /** * 조회 결과를 페이징 처리해서 가져온다. * * @param sqlString 일반 SQL 문자열 * @param pageNo 페이지 번호 (1부터 시작) * @param pageSize 페이지 크기 (보통 10) * @param parameters 질의용 인자 정보 * @param <E> 엔티티 수형 * @return 페이징 처리된 조회 결과 */ <E> IPagedList<E> getPageBySQLString(final String sqlString, int pageNo, int pageSize, HibernateParameter... parameters); /** * 지정한 엔티티에 대한 유일한 결과를 조회합니다. (결과가 없거나, 복수이면 예외가 발생합니다. * * @param dc 조회 조건 * @param <E> 엔티티 수형 * @return 조회된 엔티티 */ <E> E findUnique(DetachedCriteria dc); /** * 지정한 엔티티에 대한 유일한 결과를 조회합니다. (결과가 없거나, 복수이면 예외가 발생합니다. * * @param criteria 조회 조건 * @param <E> 엔티티 수형 * @return 조회된 엔티티 */ <E> E findUnique(Criteria criteria); /** * 지정한 엔티티에 대한 유일한 결과를 조회합니다. (결과가 없거나, 복수이면 예외가 발생합니다. * * @param query 조회 조건 * @param <E> 엔티티 수형 * @return 조회된 엔티티 */ <E> E findUnique(Query query, HibernateParameter... parameters); /** * 지정한 엔티티에 대한 유일한 결과를 조회합니다. (결과가 없거나, 복수이면 예외가 발생합니다. * * @param hql 조회 조건 * @param <E> 엔티티 수형 * @return 조회된 엔티티 */ <E> E findUniqueByHql(String hql, HibernateParameter... parameters); /** * 지정한 엔티티에 대한 유일한 결과를 조회합니다. (결과가 없거나, 복수이면 예외가 발생합니다. * * @param queryName NamedQuery의 name * @param <E> 엔티티 수형 * @return 조회된 엔티티 */ <E> E findUniqueByNamedQuery(String queryName, HibernateParameter... parameters); /** * 지정한 엔티티에 대한 유일한 결과를 조회합니다. (결과가 없거나, 복수이면 예외가 발생합니다. * * @param sqlString 일반 SQL 문 * @param <E> 엔티티 수형 * @return 조회된 엔티티 */ <E> E findUniqueBySQLString(String sqlString, HibernateParameter... parameters); /** * 질의 조건에 만족하는 첫번째 엔티티를 반환합니다. * * @param dc 질의 조건 * @param orders 정렬 방식 * @param <E> 엔티티 수형 * @return 첫번째 엔티티 */ <E> E findFirst(DetachedCriteria dc, Order... orders); /** * 지정한 엔티티에 대한 유일한 결과를 조회합니다. (결과가 없거나, 복수이면 예외가 발생합니다. * * @param criteria 조회 조건 * @param <E> 엔티티 수형 * @return 조회된 엔티티 */ <E> E findFirst(Criteria criteria, Order... orders); /** * 지정한 엔티티에 대한 유일한 결과를 조회합니다. (결과가 없거나, 복수이면 예외가 발생합니다. * * @param query 조회 조건 * @param <E> 엔티티 수형 * @return 조회된 엔티티 */ <E> E findFirst(Query query, HibernateParameter... parameters); /** * 지정한 엔티티에 대한 유일한 결과를 조회합니다. (결과가 없거나, 복수이면 예외가 발생합니다. * * @param hql 조회용 HQL 문장 * @param <E> 엔티티 수형 * @return 조회된 엔티티 */ <E> E findFirstByHql(String hql, HibernateParameter... parameters); /** * 지정한 엔티티에 대한 유일한 결과를 조회합니다. (결과가 없거나, 복수이면 예외가 발생합니다. * * @param queryName 조회용 쿼리명 * @param <E> 엔티티 수형 * @return 조회된 엔티티 */ <E> E findFirstByNamedQuery(String queryName, HibernateParameter... parameters); /** * 지정한 엔티티에 대한 유일한 결과를 조회합니다. (결과가 없거나, 복수이면 예외가 발생합니다. * * @param sqlString 일반 SQL 문자열 * @param <E> 엔티티 수형 * @return 조회된 엔티티 */ <E> E findFirstBySQLString(String sqlString, HibernateParameter... parameters); /** * 엔티티 정보가 존재하는지를 파악합니다. * * @return 엔티티 존재 여부 */ boolean exists(); /** * 조회 조건에 해당하는 엔티티 정보가 존재하는지를 파악합니다. * * @param dc 조회 조건 * @return 엔티티 존재 여부 */ boolean exists(DetachedCriteria dc); /** * 조회 조건에 해당하는 엔티티 정보가 존재하는지를 파악합니다. * * @param criteria 조회 조건 * @return 엔티티 존재 여부 */ boolean exists(Criteria criteria); /** * 조회 조건에 해당하는 엔티티 정보가 존재하는지를 파악합니다. * * @param query 조회 조건 * @return 엔티티 존재 여부 */ boolean exists(Query query, HibernateParameter... parameters); /** * 조회 조건에 해당하는 엔티티 정보가 존재하는지를 파악합니다. * * @param hql 조회 조건 * @return 엔티티 존재 여부 */ boolean existsByHql(final String hql, HibernateParameter... parameters); /** * 조회 조건에 해당하는 엔티티 정보가 존재하는지를 파악합니다. * * @param queryName 쿼리명 * @return 엔티티 존재 여부 */ boolean existsByNamedQuery(final String queryName, HibernateParameter... parameters); /** * 조회 조건에 해당하는 엔티티 정보가 존재하는지를 파악합니다. * * @param sqlString 일반 SQL 문 * @return 엔티티 존재 여부 */ boolean existsBySQLString(final String sqlString, HibernateParameter... parameters); /** * 해당 엔티티의 갯수를 구합니다. * * @return 해당 엔티티의 갯수 */ long count(); /** * 질의 조건에 해당하는 엔티티의 갯수를 구합니다. * * @param criteria 질의 조건 * @return 해당 엔티티의 갯수 */ long count(Criteria criteria); /** * 질의 조건에 해당하는 엔티티의 갯수를 구합니다. * * @param dc 질의 조건 * @return 해당 엔티티의 갯수 */ long count(DetachedCriteria dc); /** * 질의 조건에 해당하는 엔티티의 갯수를 구합니다. * * @param query 질의 조건 * @param parameters 질의 인자 값 * @return 해당 엔티티의 갯수 */ long count(Query query, HibernateParameter... parameters); /** * 엔티티를 Session에 추가합니다. 기존에 있다면 update하고, 없으면 save 합니다. * * @param entity 엔티티 * @return update 된 엔티티 */ Object merge(Object entity); /** * 엔티티를 저장합니다. * * @param entity 저장할 Transient Object */ void persist(Object entity); /** * 엔티티를 저장합니다. * * @param entity 저장할 Transient Object * @return identifier of entity. */ Serializable save(Object entity); /** * 엔티티를 저장하거나 Update 합니다. * * @param entity 엔티티 */ void saveOrUpdate(Object entity); /** * 엔티티를 Update 합니다. * * @param entity 엔티티 */ void update(Object entity); /** * 해당 엔티티를 삭제합니다. 만약 cascading 이 지정되어 있다면 cascading delete 를 수행합니다. * * @param entity 삭제할 엔티티 */ void delete(Object entity); /** * 지정한 Id값을 가진 엔티티를 삭제합니다. 만약 cascading 이 지정되어 있다면 cascading delete 를 수행합니다. * * @param id 삭제할 엔티티의 id 값 */ void deleteById(Serializable id); /** 해당 수형의 모든 엔티티를 삭제합니다. */ void deleteAll(); /** * 해당 수형의 모든 엔티티를 삭제합니다. * * @param entities 삭제할 엔티티의 컬렉션 */ void deleteAll(Collection<?> entities); /** * 질의 조건에 해당하는 모든 엔티티를 삭제합니다. * * @param dc 질의 조건 */ void deleteAll(DetachedCriteria dc); /** * 질의 조건에 해당하는 모든 엔티티를 삭제합니다. * * @param criteria 질의 조건 */ void deleteAll(Criteria criteria); /** Cascade 적용 없이 엔티티들을 모두 삭제합니다. */ int deleteAllWithoutCascade(); /** * 지정한 HQL 구문 (insert, update, delete) 을 수행합니다. * * @param hql 수행할 HQL 구문 * @param parameters 인자 정보 * @return 실행에 영향 받은 행의 수 */ int executeUpdateByHql(final String hql, HibernateParameter... parameters); /** * 지정한 name의 NamedQuery (insert, update, delete) 을 수행합니다. * * @param queryName 수행할 NamedQuery의 Name * @param parameters 인자 정보 * @return 실행에 영향 받은 행의 수 */ int executeUpdateByNamedQuery(final String queryName, HibernateParameter... parameters); /** * 지정한 HQL 구문 (insert, update, delete) 을 수행합니다. * * @param sqlString 수행할 HQL 구문 * @param parameters 인자 정보 * @return 실행에 영향 받은 행의 수 */ int executeUpdateBySQLString(final String sqlString, HibernateParameter... parameters); /** * Projection을 수행하여, 하나의 엔티티를 반환합니다. * * @param projectClass Projection 결과 클래스 * @param projectionList Projection 정보 * @param dc 질의 정보 * @param <TProject> Projection 결과 엔티티의 수형 * @return Projection 결과 */ <TProject> TProject reportOne(Class<TProject> projectClass, ProjectionList projectionList, DetachedCriteria dc); /** * Projection을 수행하여, 하나의 엔티티를 반환합니다. * * @param projectClass Projection 결과 클래스 * @param projectionList Projection 정보 * @param criteria 질의 정보 * @param <TProject> Projection 결과 엔티티의 수형 * @return Projection 결과 */ <TProject> TProject reportOne(Class<TProject> projectClass, ProjectionList projectionList, Criteria criteria); /** * Projection을 수행합니다. * * @param projectClass Projection 결과 클래스 * @param projectionList Projection 정보 * @param dc 질의 정보 * @param <TProject> Projection 결과 엔티티의 수형 * @return Projection 결과 컬렉션 */ <TProject> List<TProject> reportList(Class<TProject> projectClass, ProjectionList projectionList, DetachedCriteria dc); /** * Projection을 수행합니다. * * @param projectClass Projection 결과 클래스 * @param projectionList Projection 정보 * @param dc 질의 정보 * @param firstResult 첫번째 결과 인덱스 (0부터 시작) * @param maxResults 최대 결과 갯수 * @param <TProject> Projection 결과 엔티티의 수형 * @return Projection 결과 컬렉션 */ <TProject> List<TProject> reportList(Class<TProject> projectClass, ProjectionList projectionList, DetachedCriteria dc, int firstResult, int maxResults); /** * Projection을 수행합니다. * * @param projectClass Projection 결과 클래스 * @param projectionList Projection 정보 * @param criteria 질의 정보 * @param <TProject> Projection 결과 엔티티의 수형 * @return Projection 결과 컬렉션 */ <TProject> List<TProject> reportList(Class<TProject> projectClass, ProjectionList projectionList, Criteria criteria); /** * Projection을 수행합니다. * * @param projectClass Projection 결과 클래스 * @param projectionList Projection 정보 * @param criteria 질의 정보 * @param firstResult 첫번째 결과 인덱스 (0부터 시작) * @param maxResults 최대 결과 갯수 * @param <TProject> Projection 결과 엔티티의 수형 * @return Projection 결과 컬렉션 */ <TProject> List<TProject> reportList(Class<TProject> projectClass, ProjectionList projectionList, Criteria criteria, int firstResult, int maxResults); /** * Projection을 수행합니다. * * @param projectClass Projection 결과 클래스 * @param projectionList Projection 정보 * @param dc 질의 정보 * @param pageNo page number. (1부터 시작) * @param pageSize page size. * @param <TProject> Projection 결과 엔티티의 수형 * @return Projection 결과 컬렉션 */ <TProject> IPagedList<TProject> reportPage(Class<TProject> projectClass, ProjectionList projectionList, DetachedCriteria dc, int pageNo, int pageSize); /** * Projection을 수행합니다. * * @param projectClass Projection 결과 클래스 * @param projectionList Projection 정보 * @param criteria 질의 정보 * @param pageNo page number. (1부터 시작) * @param pageSize page size. * @param <TProject> Projection 결과 엔티티의 수형 * @return Projection 결과 컬렉션 */ <TProject> IPagedList<TProject> reportPage(Class<TProject> projectClass, ProjectionList projectionList, Criteria criteria, int pageNo, int pageSize); }