728x90
반응형
JPA에서 Specification으로 사용자 정의 함수 where절 조건 검색하기
### Specification
public static Specification<Entity> nameLike(String text) {
return (root, query, cb) -> {
Expression<String> nameExpr = cb.function("fn_usrNm", String.class, root.get("name"));
return cb.like(nameExpr, "%" + text + "%");
};
}
1. 사용자 정의 함수(sql function) 1개의 조건일 경우
#### Service
Specification<Entity> spec = Specification.where(EntitySpec.nameLike(text));
2. 사용자 정의 함수(sql function) 외 1개 이상 조건일 경우
#### Service
Specification<Entity> spec = Specification.where(EntitySpec.hasBetweenDate(startDate, endDate));
if (!text.isEmpty()) {
if(!field.isEmpty()){
if(field.equals("name")){
spec = spec.and(EntitySpec.nameLike(text));
} else {
spec = spec.and(EntitySpec.fieldLike(req.field, text));
}
} else {
spec = spec.and(EntitySpec.fieldLike("title", text))
.or(EntitySpec.fieldLike("content", text))
.or(EntitySpec.nameLike(text));
}
}
Repogirory
#### Service
Page<Entity> dataList = repository.findAll( spec, pageable );
#### Repogitory
Page<Entity> findAll(Specification<Entity> spec, Pageable pageable);
Specification 사용시 동적인 조건 검색을 쉽게 구현 가능합니다
코드의 가독성이 높아지고, 검색조건이 다양해져도 재사용 할 수 있기 때문에, 유지보수성도 향상된다
하지만 일부 서브쿼리의 구현이 어려우며 초기 러닝커브가 높다.
성능 이슈가 있을 수 있으나, Specification은 동적인 검색 조건을 생성하기 위해 매번 SQL 쿼리를 생성한다. 이는 성능 이슈를 일으킬 수 있으나 Spring Data JPA는 이러한 문제를 해결하기 위해 쿼리 캐시와 같은 다양한 최적화 기능을 제공한다
728x90
반응형
'공부의 > JAVA' 카테고리의 다른 글
[VSCODE] java.lang.NoClassDefFoundError 해결 방법 (0) | 2023.03.17 |
---|---|
[Spring Data JPA] jpql(@Query)이 동작하지 않을때, No property / Did you mean error (0) | 2023.03.09 |
JPA native Query count 방법 (0) | 2023.03.02 |
DATA JPA 사용자 정의 함수 사용하기 , Dialect 정의 방법 (0) | 2023.03.02 |