Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Info

SPRING-JPA에서 QueryDSL을 사용하기위해 몇가지 준비작업이 있으며SPRING BOOT STARTER 1.5 버젼을 기준으로 작동되는 방식으로 정리하였습니다.데이터 검색을 위한 질의(Query)방식은 여러가지가 있으며

총 5가지 방식으로 요약이 됩니다.

  • SQL(Native)
  • Query Function
  • JPQL
  • Criteria Query
  • Query DSL

함수쿼리/JPQL은 앞장에서 다루었으며

QueryDSL과 Criteria Query 두가지 방식 사용법을 알아보겠습니다.


Code Link : http://git.webnori.com/projects/WEBF/repos/spring_jpa/browse/src/test/java/com/example/demo/jpa/JpaDSL.java

QueryDSL

...


SPRING-JPA 에서 QueryDSL사용을 위한 단계

  • Entity QDomain 메타 지원을 위한 pom.xml 수정
  • 기존 Repository 인터페이스에서, QueryDslPredicateExecutor 추가 상속받음
  • Builder 클래스를 통해 각종 검색옵션 조합하여 , 기존 쿼리메스드(findall()) 에 인자값으로 전달가능


Spring-Boot-Starter 에서 QueryDSL 사용을 위한 pom.xml 수정

Expand
titlepom.xml
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.9.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
.....................
<dependencies>
.....................
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-core</artifactId>
            <version>4.1.3</version>
        </dependency>
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
            <version>4.1.3</version>
        </dependency>
.....................
</dependencies>
.....................
	<build>
		<plugins>
            <!-- MUST add to use generate QueryDSL -->
            <plugin>
                <groupId>com.mysema.maven</groupId>
                <artifactId>apt-maven-plugin</artifactId>
                <version>1.1.3</version>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>process</goal>
                        </goals>
                        <configuration>
                            <!-- Specifies the directory in which the query types are generated -->
                            <outputDirectory>target/generated-sources/querydsl</outputDirectory>
                            <!-- States that the APT code generator should look for JPA annotations -->
                            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                        </configuration>
                    </execution>
                </executions>
                <dependencies>
	                <dependency>
			          <groupId>com.querydsl</groupId>
			          <artifactId>querydsl-apt</artifactId>
			          <version>4.1.3</version>
			      	</dependency>
		      	</dependencies>
            </plugin>


		</plugins>				
	</build>
.....................

...

Maven-Update Project를 수행합니다. 



QueryDSL지원을 위한 Repository 정의

JPA에서 사용하던 Repository에서 QueryDslPredicateExecutor 만 추가로 상속받으면 사용준비가 끝납니다.

...

Code Block
languagejava
themeEmacs
package com.example.demo.data;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QueryDslPredicateExecutor;


public interface AddressRepoDSL extends JpaRepository<Address, Long>,
QueryDslPredicateExecutor<Address>{
	
}


QueryDSL을 활용하여 쿼리빌드하기

Code Block
languagejava
themeEmacs
	@Autowired
	private AddressRepoDSL addressRepoDSL;
	public void jpa_queryDslTest() {
		
		QAddress	userAddress = QAddress.address1;
		BooleanBuilder builder = new BooleanBuilder();
		
		builder.and(userAddress.name.eq("민수1") )
			   .and(userAddress.address.like("%" + "서" +"%"));		
				
		Iterable<Address> addressList =  addressRepoDSL.findAll(builder);
		addressList.forEach( item -> {
			String itemString = String.format("%d%s %s %s %s %s",item.getId(),item.getName(),
					item.getPhoneNbr(), item.getSex(),item.getAddress(),item.getAge());
			System.out.println(itemString);
		});		
	}

...

기존에는 3가지종류의 SQL문을 사용해야한 동일한 검색 옵션을 수행하던것을

아래와같이 두줄로 표현이 가능합니다.  null은 어플리케이션에서도 애매모호한 값이며

Java의 Optional을 이용하면 null처리의 애매모호성에 대해 조금더 유연하게 처리가능하며...

이것은 추후 Rest를 이용한 검색API에서 다루도록 하겠습니다.

No Format
if(name!=null) builder.and(userAddress.name.eq("민수1") );
if(address!=null) builder.and(userAddress.address.like("%" + "서" +"%"));


CriteriaQuery

...