-
JPA를 사용한 Querydsl 가이드자바 JAVA 2020. 12. 18. 06:01
1. 개요
Querydsl은 광범위한 Java 프레임 워크로, SQL과 유사한 도메인 특정 언어로 유형 안전 쿼리 를 만들고 실행하는 데 도움이됩니다 .
이 기사에서는 Java Persistence API를 사용하여 Querydsl을 살펴 보겠습니다.
여기서 빠른 참고 사항은 Hibernate 용 HQL이 Querydsl의 첫 번째 대상 언어 였지만 현재는 JPA, JDO, JDBC, Lucene, Hibernate Search, MongoDB, Collections 및 RDFBean을 백엔드로 지원한다는 것입니다.
2. 준비
먼저 Maven 프로젝트에 필요한 종속성을 추가해 보겠습니다.
더보기<properties>
<querydsl.version>2.5.0</querydsl.version>
</properties>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>${querydsl.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
이제 Maven APT 플러그인을 구성 해 보겠습니다.
<project>
<build>
<plugins>
...
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
</project>
JPAAnnotationProcessor는 주석 도메인 유형을 찾을 수 javax.persistence.Entity의 주석을 그들을 위해 쿼리 유형을 생성합니다.
3. Querydsl을 사용한 쿼리
쿼리는 도메인 유형의 속성을 반영하는 생성 된 쿼리 유형을 기반으로 구성됩니다. 또한 함수 / 메서드 호출은 완전히 형식이 안전한 방식으로 구성됩니다.
쿼리 경로 및 작업은 모든 구현에서 동일하며 쿼리 인터페이스 에도 공통 기본 인터페이스가 있습니다.
3.1. 엔터티 및 Querydsl 쿼리 유형
먼저 예제를 통해 사용할 간단한 엔티티를 정의 해 보겠습니다.
더보기@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private String firstname;
@Column
private String surname;
Person() {
}
public Person(String firstname, String surname) {
this.firstname = firstname;
this.surname = surname;
}
// standard getters and setters
}
Querydsl은 Person 과 동일한 패키지에 QPerson 이라는 단순한 이름의 쿼리 유형을 생성합니다 . QPerson 은 Person 유형 의 대표로서 Querydsl 쿼리에서 정적으로 유형이 지정된 변수로 사용될 수 있습니다 .
첫째 – QPerson 에는 정적 필드로 액세스 할 수있는 기본 인스턴스 변수가 있습니다.
QPerson person = QPerson.person;
또는 다음 과 같이 사용자 고유의 Person 변수를 정의 할 수 있습니다 .
QPerson person = new QPerson("Erich", "Gamma");
3.2. JPAQuery를 사용하여 쿼리 작성
이제 쿼리에 JPAQuery 인스턴스를 사용할 수 있습니다 .
JPAQuery query = new JPAQuery(entityManager);
점을 유의 위해 entityManager가 JPA이다 의 EntityManager .
이제 빠른 예로서 이름이 " Kent "인 모든 사람을 검색해 보겠습니다 .
QPerson person = QPerson.person;
List<Person> persons = query.from(person).where(person.firstName.eq("Kent")).list(person);
에서 호출은 쿼리 소스 및 프로젝션, 정의 부분은 필터를 정의하고 목록 Querydsl이 일치하는 모든 요소를 반환하도록 지시합니다.
여러 필터를 사용할 수도 있습니다.
query.from(person).where(person.firstName.eq("Kent"), person.surname.eq("Beck"));
또는:
query.from(person).where(person.firstName.eq("Kent").and(person.surname.eq("Beck")));
기본 JPQL 형식에서 쿼리는 다음과 같이 작성됩니다.
select person from Person as person where person.firstName = "Kent" and person.surname = "Beck"
"또는"을 통해 필터를 결합하려면 다음 패턴을 사용하십시오.
query.from(person).where(person.firstName.eq("Kent").or(person.surname.eq("Beck")));
4. Querydsl의 순서 및 집계
이제 Querydsl 라이브러리 내에서 정렬 및 집계가 작동하는 방식을 살펴 보겠습니다.
4.1. 주문
성 필드를 기준으로 결과를 내림차순으로 정렬하는 것으로 시작 합니다.
더보기QPerson person = QPerson.person;
List<Person> persons = query.from(person)
.where(person.firstname.eq(firstname))
.orderBy(person.surname.desc())
.list(person);
4.2. 집합
이제 사용 가능한 몇 가지 (Sum, Avg, Max, Min)가 있으므로 간단한 집계를 사용하겠습니다.
QPerson person = QPerson.person;
int maxAge = query.from(person).list(person.age.max()).get(0);
4.3. GroupBy를 사용한 집계
com.mysema.query.group.GroupBy의 클래스는 우리가 메모리에 집계 쿼리 결과에 사용할 수있는 통합 기능을 제공합니다.
다음 은 firstname 을 키로, max age 를 값으로 사용하여 결과가 Map 으로 반환되는 빠른 예입니다 .
더보기QPerson person = QPerson.person;
Map<String, Integer> results =
query.from(person).transform(
GroupBy.groupBy(person.firstname).as(GroupBy.max(person.age)));
5. Querydsl로 테스트
이제 Querydsl을 사용하여 DAO 구현을 정의하고 다음 검색 작업을 정의 해 보겠습니다.
더보기public List<Person> findPersonsByFirstnameQuerydsl(String firstname) {
JPAQuery query = new JPAQuery(em);
QPerson person = QPerson.person;
return query.from(person).where(person.firstname.eq(firstname)).list(person);
}
이제이 새로운 DAO를 사용하여 몇 가지 테스트를 빌드하고 Querydsl을 사용하여 새로 생성 된 Person 개체 ( PersonDao 클래스 에서 구현 됨)를 검색하고 GroupBy 클래스를 사용하는 다른 테스트 집계에서 테스트 해 보겠습니다 .
더보기@Autowired
private PersonDao personDao;
@Test
public void givenExistingPersons_whenFindingPersonByFirstName_thenFound() {
personDao.save(new Person("Erich", "Gamma"));
Person person = new Person("Kent", "Beck");
personDao.save(person);
personDao.save(new Person("Ralph", "Johnson"));
Person personFromDb = personDao.findPersonsByFirstnameQuerydsl("Kent").get(0);
Assert.assertEquals(person.getId(), personFromDb.getId());
}
@Test
public void givenExistingPersons_whenFindingMaxAgeByName_thenFound() {
personDao.save(new Person("Kent", "Gamma", 20));
personDao.save(new Person("Ralph", "Johnson", 35));
personDao.save(new Person("Kent", "Zivago", 30));
Map<String, Integer> maxAge = personDao.findMaxAgeByName();
Assert.assertTrue(maxAge.size() == 2);
Assert.assertSame(35, maxAge.get("Ralph"));
Assert.assertSame(30, maxAge.get("Kent"));
}
6. 결론
이 튜토리얼은 Querydsl을 사용하여 JPA 프로젝트를 빌드하는 방법을 설명했습니다.
이 기사 의 전체 구현 은 github 프로젝트에서 찾을 수 있습니다. 이것은 Eclipse 기반 maven 프로젝트이므로 그대로 가져 와서 실행하기 쉽습니다.
여기서 빠른 메모는 – 간단한 maven 빌드 (mvn 새로 설치)를 실행하여 유형을 target / generated-sources에 생성 한 다음 Eclipse를 사용하는 경우 폴더를 프로젝트의 소스 폴더로 포함합니다.
'자바 JAVA' 카테고리의 다른 글
트랜잭션 처리 ? [ 트랜잭션 이 뭐길래? ] (0) 2021.05.02 RDBMS VS NOSQL [ RDBMS와 NOSQL 차이점은 무엇일까? (0) 2021.05.02 자바 GUI, 추상클래스에 대한 설명 (0) 2020.08.01 자바 트랜젝션, 클래스에 대한 이해 (0) 2020.08.01 자바 문자열 변환과 교체 (0) 2020.07.29