Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- EmbeddedId
- 티스토리챌린지
- Protecle
- pooled-lo
- RootGraph
- deserializer
- fractional seconds
- apatch poi
- MSSQL
- +9:00
- 운동해서 광명찾자
- 버전 문자열 비교
- mysql =
- 1*1000
- MYSQL
- AuditingEntityListener
- mysql equal null
- load order
- 오블완
- mysql not equal null
- createEntityGraph
- spring boot
- NamedEntityGraph
- https
- getDateCellValue
- @EntityListeners
- yml
- getEntityGraph
- @CreateDate
- sendFractionalSeconds
Archives
- Today
- Total
Hello
Spring Data JPA Specification 간단한 사용 본문
728x90
간단한 검색이 필요한 API를 만들어야했는데, 쿼리 메서드를 사용해 작성하게 되면 서비스 코드에 if의 향연이 펼쳐 질 것 제외 했다. 그리고 프로젝트 규모가 너무 작아 Querydsl 사용하기 보다는 Srping Data JPA의 Specification을 사용해 보았습니다. Specification은 JPA Criteria를 활용해 조회 쿼리를 작성 하도록 지원합니다.
Specification 사용 방법
public interface NoticeRepo extends JpaRepository<Notice, Integer>, JpaSpecificationExecutor<Notice> {
}
기존에 사용하던 Repository에 JpaSpecificationExecutor 를 상속합니다.
JpaSpecificationExecutor 는 조회 기능만 지원합니다.
아래 이미지를 보면 매개변수로 Specification을 받는 것을 알 수 있습니다.
NoticeSpecification 쿼리 조건 함수 작성
public class NoticeSpecification {
public static Specification<Notice> equalNoticeType(Integer type) {
return (root, query, criteriaBuilder) -> criteriaBuilder.equal(root.get("NoticeType"), type);
}
public static Specification<Notice> equalStatus(Boolean status) {
return (root, query, criteriaBuilder) -> criteriaBuilder.equal(root.get("status"), status);
}
}
서비스코드 작성
public List<Notice> notices(Integer noticeType, Boolean status) {
Specification<Notice> where = Specification.where((root, query, criteriaBuilder) -> null);
if (noticeType != null) where = where.and(NoticeSpecification.equalNoticeType(noticeType));
if (status != null) where = where.and(NoticeSpecification.equalStatus(status));
return jobNoticeRepo.findAll(where, Sort.by(Sort.Direction.DESC, "id"));
}
넘겨 받은 매개변수에 따라 spce를 추가한다.
실행결과
select
notice0_.id as id1_0_,
notice0_.contents as contents2_0_,
notice0_.notice_type as notice_type3_0_,
notice0_.language_id as language7_0_,
notice0_.priority as priority4_0_,
notice0_.status as status5_0_,
notice0_.title as title6_0_
from
tb_notice notice0_
where
notice0_.status=?
and notice0_.notice_type=0
order by
notice0_.id desc
나는 equal만 사용했지만, like, ls, gt, between, and, or 등 쿼리문을 사용할 수 있습니다.
참고 : https://www.baeldung.com/rest-api-search-language-spring-data-specifications
https://spring.io/blog/2011/04/26/advanced-spring-data-jpa-specifications-and-querydsl
728x90
'spring' 카테고리의 다른 글
Spring properties vs YAML (0) | 2023.09.18 |
---|---|
SpringBoot-ShedLock DuplicateKeyException이슈?? (0) | 2023.09.14 |
Spring Data JPA 사용 시 service method에 @transactional 없이 transaction 처리되는 이유 (0) | 2023.08.02 |
spring 다국어 지원을 위한 설정 (0) | 2023.03.03 |
Jpa mssql Dialect SQLServer2012 Offset절 사용 (0) | 2021.07.29 |