SQLQueryFactory 및 Query Type 생성을 위한 MAVEN 설정
n SQLQueryFactory는 엔티티가 생성되지 않은 상태에서 DB에 JPA의 메소드기반으로 쿼리를 타입세이프하게 만들어 실행하는 방법을 제공한다. 그러기위해 DB스키마와같은 쿼리타입을 자바단에 만들어 두어야 하는데 그걸 코드 제너레이션 이라한다.
n 메이븐을 통해 하려면 메이븐 설정에 querydsl-sql 또는 querydsl-sql-spring, dermy 의존성을 추가하고 querydsl-maven-plugin을 이용하여 DB스키마 구조대로 쿼리를 위한 쿼리타입 클래스(QXXX..)를 만들어야 한다.
n 그런다음 SQLQueryFactory를 통해 타입세이프하게 메소드기반의 자바코드로 쿼리문을 만들면 DB에 SQL문이 전달되어 실행된다.
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-sql</artifactId>
<version>${querydsl.version}</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-sql-codegen</artifactId>
<version>${querydsl.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
n 아래처럼 Maven을 이용해서 Code Generation을 하는 경우라면 querydsl-sql-codegen 의존성은 필요없다. Maven을 이용하여 DB스키마 코드를 Generation 하기 위해서는 아래 plugin을 추가해야 한다.
<plugins>
...
<plugin>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-maven-plugin</artifactId>
<version>${querydsl.version}</version>
<executions>
<execution>
<goals>
<goal>export</goal>
</goals>
</execution>
</executions>
<configuration>
<jdbcDriver>org.apache.derby.jdbc.EmbeddedDriver</jdbcDriver>
<jdbcUrl>jdbc:derby:target/demoDB;create=true</jdbcUrl>
<packageName>com.myproject.domain</packageName>
<targetFolder>${project.basedir}/target/generated-sources/java</targetFolder>
</configuration>
<dependencies>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>${derby.version}</version>
</dependency>
</dependencies>
</plugin>
...
</plugins>
n 만약 Spring Integration을 이용하려면 querydsl-sql 대신 query-sql-spring 의존성을 추가하면 된다.
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-sql-spring</artifactId>
<version>${querydsl.version}</version>
</dependency>
이 설정은 스프링 예외처리와 스프링의 TransactionManager를 이용하여 Querydsl SQL의 위한 Spring Connection을 제공한다. 아래 스프링 설정 예문을 참조하자.
import com.querydsl.sql.H2Templates;
import com.querydsl.sql.SQLQueryFactory;
import com.querydsl.sql.SQLTemplates;
import com.querydsl.sql.spring.SpringConnectionProvider;
import com.querydsl.sql.spring.SpringExceptionTranslator;
import com.querydsl.sql.types.DateTimeType;
import com.querydsl.sql.types.LocalDateType;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.sql.DataSource;
import java.sql.Connection;
@Configuration
public class JdbcConfiguration {
@Bean
public DataSource dataSource() {
// implementation omitted
}
@Bean
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
@Bean
public com.querydsl.sql.Configuration querydslConfiguration() {
SQLTemplates templates = H2Templates.builder().build(); //change to your Templates
com.querydsl.sql.Configuration configuration = new com.querydsl.sql.Configuration(templates);
configuration.setExceptionTranslator(new SpringExceptionTranslator());
return configuration;
}
@Bean
public SQLQueryFactory queryFactory() {
Provider<Connection> provider = new SpringConnectionProvider(dataSource());
return new SQLQueryFactory(querydslConfiguration(), provider);
}
}
n 위와 같이 의존성 및 플러그인을 추가함으로써 DB스키마 코드를 만드는 것과 SQLQueryFactory를 이용하여 DB쪽으로 직접쿼리 할 수 있다.
n DB스키마를 Querydsl을 위한 쿼리 타입으로 변환하기 위해서는 다음과 같이 하면 된다.
java.sql.Connection conn = ...;
MetaDataExporter exporter = new MetaDataExporter();
exporter.setPackageName("com.myproject.mydomain");
exporter.setTargetFolder(new File("target/generated-sources/java"));
exporter.export(conn.getMetaData());
n Configuration은 아래처럼 생성한다. MySQL5.5 이상 이라면 MySQLTemplates, 오라클 이라면 OracleTemplates을 사용하면 된다.
//MySQL이라면 MySQLTemplates, Oracle이라면 OracleTemplates를 사용하면 된다.
SQLTemplates templates = new H2Templates();
Configuration configuration = new Configuration(templates);
n 아래와 같이 SQLQueryFactory를 생성한 후 쿼리를 만들어 실행하면 된다.
SQLQueryFactory queryFactory = new SQLQueryFactory(configuration, dataSource);
댓글 없음:
댓글 쓰기