이번시간엔 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을 알아봤다.
더 자세한건 레퍼런스를 보면서 한번씩 해보면 될 것 같다.