Hibernate만을 사용하여 데이터 액세스 처리를 수행할 때 입력 조건에 따라 동적으로 변경되는 HQL문을
만들기 위해서는 해당되는 자바 코드 내에 HQL문을 만들기 위한 로직이 포함되어야 한다. 이로 인해
HQL문과 자바 코드가 뒤섞이게 되어, 변경 및 유지보수가 어려워질 수 있다. 따라서, Anyframe에서는
별도 XML에 동적으로 변경되는 HQL문을 정의하여 Hibernate을 이용하여 처리할 수 있도록
Hibernater과 Velocity를 연동한 DynamicHibernateService를 제공한다.
DynamicHibernateService에 대한 구현체는 1가지이며, 다음은 각 구현체별 사용 방법이다.
DynamicHibernateService
DynamicHibernate Configuration
다음은 DynamicHibernateService를 사용하기 위해 필요한 설정 정보이다.
| Property Name |
Description |
Required |
Default Value |
| sessionFactory |
Hibernate Session을 이용하여 HQL을 처리하는데 사용될 SessionFactory Bean의 id |
Y |
N/A |
| fileNames |
Dynamic HQL이 정의된 파일 경로 또는 해당하는 디렉토리 정보 |
Y |
N/A |
다음은 위에서 열거한 속성 정보를 포함한
context-hibernate.xml 파일의 일부이다.
<bean id="dynamicHibernateService"
class="anyframe.core.hibernate.impl.DynamicHibernateService">
<property name="sessionFactory" ref="sessionFactory" />
<property name="fileNames">
<list>
<value>classpath:anyframe/core/hibernate/spring/dynamic-hibernate.xml</value>
</list>
</property>
</bean>
Dynamic HQL 정의 파일
DynamicHibernateService 속성 정의 파일 내의 filenames 값으로 정의한 Dynamic HQL 정의 파일은 다음과 같이 구성된다.
dynamic-hibernate 태그는 여러 개의 query 태그를 포함할 수 있다. query 태그는 Velocity Rule을 접목시켜 Dynamic HQL문을 정의하기 위한 용도이며,
해당 HQL의 식별을 위해 name이라는 속성을 가져야 한다. query 태그 내에서는 text 치환과 named parameter 형태를 통해 Dynamic HQL 설정을
지원한다. 다음과 같은 syntax를 사용하면 다양한 형태로 운영시 조건 값에 따라 동적으로 HQL을 변환할 수 있다.
- ‘:Parameter Name’
: Named Parameter 형태로 변수를 지정할 때 사용한다.
- {{치환 문자열 키}}
: 키에 해당하는 문자열로 치환하여 Query를 수행한다.
- #if ~ (#elseif) ~ #end
: 조건 분기
- # foreach ~ #end
: Loop
- $titanCount
: foreach 구문내의 Loop index
다음은 Dynamic HQL을 포함하고 있는
dynamic-hibernate.xml 파일의 일부로,
입력 조건에 director 정보가 포함되어 있으면, director 정보에 대해 like 조건으로 검색하는 HQL이 생성되고, 그렇지 않을 경우에는
title 정보에 대해 like 조건으로 검색하는 HQL이 생성될 것이다. 이 외에도 sortColumn, sortDirection 정보도 입력 조건으로 전달받도록
정의되어 있음을 알 수 있다.
<dynamic-hibernate>
<query name="findMovieListAll">
FROM Movie movie
WHERE
#if(${director})
movie.director like :director
#else
movie.title like :title
#end
ORDER BY {{sortColumn}} {{sortDirection}}
</query>
</dynamic-hibernate>
DynamicHibernateService 활용 예제
DynamicHibernateService를 활용하기 위해서는
MovieDAOHibernateImpl 코드에서처럼
DynamicHibernateService를 통해 입력 조건과 해당 Dynamic HQL의 name을 전달하도록 한다.
public List findMovieList(int conditionType, String condition)
throws Exception {
Object[] args = new Object[3];
if (conditionType == 0) {
args[0] = "director=%" + condition + "%";
args[1] = "sortColumn=movie.director";
} else {
args[0] = "title=%" + condition + "%";
args[1] = "sortColumn=movie.title";
}
args[2] = "sortDirection=ASC";
return dynamicHibernateService.findList("findMovieListAll", args);
}