ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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를 사용하는 경우 폴더를 프로젝트의 소스 폴더로 포함합니다.

    댓글

Designed by Tistory.