본문 바로가기
공부의/JAVA

[JPA] Specification 사용자 정의 함수 사용

by 포로리씨 2023. 3. 7.
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
반응형