티스토리 뷰
쿼리DSL를 쓰기 위해서는
pom.xml에 추가하기(maven)
dependency 추가
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
</dependency>
plugin 추가(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/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
Maven > Lifecycle > compile 해야 함..!
쿼리dsl은 build를 시켜야 사용할 수 있음.
엔티티가 다 인식이 되어서 Q가 붙는다. >> querydsl에서 사용하는 객체
엔티티들을 빌드를 통해서 따로 만들어 놓는다. (target에서 실제 경로랑 똑같이)
JPAQueryFactory로 시작함.
queryfactory는 지금 사용하고 있는 entitymanager가 필요하다.
select , from, where >> 다 메소드형식으로 사용 >> 오타가 없다.
QOwner >> 쓰기 귀찮으니 static으로 임포트해놓으면 owner만 써도 된다.
fetchOne() >> 결과가 1개일 때
JPAQueryFactory도 bean으로 등록해서 주입만 받으면 될 수 있게 할 수 있다.
따로 config 파일을 만들어서 Bean으로 컨테이너에 등록한다.
JPAQueryFactory를 주입시켜서 new할 필요없이 쓰면 된다.
selectFrom() 으로 쓸 수도 있다.
eq()은 같은지 비교할 때 사용.
loe() 이하 (less or equal)
goe() 이상(grater or equal)
gt() 초과(grater)
lt() 미만
like
contains...
정렬
orderBy(owner.ownerName.desc())
페이징처리
.offset(0)
.limit(10)
fetchFirst() 첫번째꺼 가져오기
fetch 사용
정렬, 페이징까지 완료
문자열이 숫자라도 정렬하면 박살남..
offset(10) >> 2페이지(0~9, 10~19)
엔티티를 화면에서 쓰면 안된다. >> DTO로 다 바꿔야 한다.
DB쪽에서 서비스를 제작할 때까지는 엔티티로,
컨트롤러에서는 DTO로 해야 함.
페이지처리
page, amount : 1페이지, 2페이지 ( Pageable )
offset, limit : ~부터 ( 순수 jpa, querydsl -> offset, jpql)
page, offset 둘다 0부터 시작함.
PageImpl > 페이지를 지정받아서 구현한 클래스,
content, pageable, total를 넣어주면 필요한 연산을 알아서 해줌.
content >> fetch로 가져온 list
pageable >> 매개변수에 있는 pageable(3페이지면, 3이랑 amount 10이 전달될 것임)
컨트롤러에서 메소드의 화면에서 받을 pageable 그대로 쓰면 됨.
total >> fetch().size()해서 구한 총 개수 넣어주면 됨.
page는 0부터 시작하니까
화면에서 작업할 때
page 이전 페이지 / page+1 현재 페이지 / page+2 다음 페이지
참고 https://ivvve.github.io/2019/01/13/java/Spring/pagination_4/
public interface OwnerCustomRepository {
public Page<Owner> findAllByOwnerName(Pageable pageable);
}
@Repository
@RequiredArgsConstructor
public class OwnerCustomRepositoryImpl implements OwnerCustomRepository {
private final JPAQueryFactory jpaQueryFactory;
@Override
public Page<Owner> findAllByOwnerName(Pageable pageable) {
List<Owner> owners = jpaQueryFactory.selectFrom(owner)
.where(owner.ownerName.eq("홍길동"))
.orderBy(owner.ownerId.desc())
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
long total = jpaQueryFactory.selectFrom(owner)
.where(owner.ownerName.eq("홍길동"))
.fetch().size();//총 개수
return new PageImpl<>(owners, pageable, total);
}
}
public interface OwnerRepository extends JpaRepository<Owner, Long>, OwnerCustomRepository {
}
test에서
OwnerRepository.findAllByOwnerName().. 이런 식으로 쓰면 된다.
'2022 > jpa' 카테고리의 다른 글
day06[queryDSL-3] (0) | 2022.12.01 |
---|---|
day06[queryDSL-2] (0) | 2022.12.01 |
day06[jpa, mybatis 연동] (0) | 2022.12.01 |
day05[다대일 양방향 관계] (0) | 2022.12.01 |
day04[다대일관계, N:1] (0) | 2022.11.30 |