이번시간엔 querydsl에 대해 알아보자
한글 레퍼런스는 여기
querydsl 은 JPQL와 Criteria를 대체 할 수 있으며 더 쉽다. 그게 장점이다.

일단 다음과 같이 메이븐에 추가하자

<dependency>
    <groupId>com.mysema.querydsl</groupId>
    <artifactId>querydsl-apt</artifactId>
    <version>${querydsl.version}</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>com.mysema.querydsl</groupId>
    <artifactId>querydsl-jpa</artifactId>
    <version>${querydsl.version}</version>
</dependency>
...

<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/java</outputDirectory>
                <processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor>
            </configuration>
        </execution>
    </executions>
</plugin>

간단하게 entity를 추가하자

@Data
@Entity
@NoArgsConstructor
@RequiredArgsConstructor
public class Account {

    @Id
    @GeneratedValue
    private Long id;

    @NotBlank
    @Size(min = 5, max = 100)
    @NonNull
    private String name;

    @NotBlank
    @Size(min = 2, max = 100)
    @NonNull
    private String password;

    @NonNull
    private String email;
}

일반 적인 자바빈 형태다.
그리고 나서 repository 클래스를 만들자

public interface AccountRepository extends JpaRepository<Account, Long>{
}

그런후에 querydsl을 사용할 인터페이스를 만들어야 된다.
필자는 이렇게 만들었다

public interface CustomAccountRepository {

    Page<Account> findByemail(String email, Pageable pageable);

    Account findByname(String name);
}

실질적으로 저 인터페이스는 구현해야 된다.
인터페이스를 구현할 클래스를 만들자

public class AccountRepositoryImpl extends QueryDslRepositorySupport implements CustomAccountRepository {

    public AccountRepositoryImpl() {
        super(Account.class);
    }

    @Override
    public Page<Account> findByemail(String email, Pageable pageable) {
        QAccount account = QAccount.account;
        SearchResults<Account> accountSearchResults =
                from(account)
                        .where(account.email.like("%" + email + "%"))
                        .limit(pageable.getPageSize())
                        .offset(pageable.getOffset())
                        .listResults(account);
        return new PageImpl<>(accountSearchResults.getResults(), pageable, accountSearchResults.getTotal());
    }

    @Override
    public Account findByname(String name) {
        QAccount account = QAccount.account;
        return from(account)
                .where(account.name.eq(name))
//                .uniqueResult(account) //하나 이상이면 에러
                .singleResult(account); //하나 이상이면 처음거를 반환
    }
}

밑에서 다시 설명하도록 하고 그전에 AccountRepository인터페이스에 CustomAccountRepository를 상속하자

public interface AccountRepository extends JpaRepository<Account, Long>, CustomAccountRepository {
}

QAccount 처럼 Q파일이 없다면 메이븐을 인스톨하자

mvn install 

소스를 보면 query랑 비슷한거를 확인 할 수 있다.
sql는다 알고 있으니 설명은 하지 않겠다.
한번씩 해보면 다 알듯 하다.
조인도 가능하고 서브 쿼리도 가능하다.

중요한건 마지막에있는 메소드이다.
listResults와 uniqueResult,singleResult 이것들이다.
listResults는 SearchResults타입을 리턴한다. 거기 안에 limit, offset, totalCount등 페이징에 필요한 메소드들이 포함되어있다.
List로 리턴 받을 수 있다. listResults 대신 list를 사용하면된다.

다음 으론 uniqueResult 단일 메소드이다. 한개만 가져오고 만약 한개 이상이면 에러가 난다. singleResult도 uniqueResult 와 똑같이 한개만 가져오지만 만약 한개 이상일 경우에는 제일 처음 것을 가져 온다.

일단 단순하게 querydsl을 알아봤다.
더 자세한건 레퍼런스를 보면서 한번씩 해보면 될 것 같다.