Spring/Spring Data JPA

[Spring Data JPA] 4-1. Spring Data Extensions (1)

noahkim_ 2024. 8. 2. 18:00

1. Querydsl Extension

  • Spring Data JPA 모듈과 통합

 

QuerydslPredicateExecutor

public interface QuerydslPredicateExecutor<T> {
  Optional<T> findOne(Predicate predicate);  
  Iterable<T> findAll(Predicate predicate);   
  long count(Predicate predicate);            
  boolean exists(Predicate predicate);        
  // … more functionality omitted.
}
  • 조건에 대한 동적 쿼리 생성

 

예제

더보기
interface UserRepository extends JpaRepository<User, Long>, QuerydslPredicateExecutor<User> {
}
QUser user = QUser.user;

Predicate predicate = user.firstname.equalsIgnoreCase("dave")
    .and(user.lastname.startsWithIgnoreCase("mathews"));

Iterable<User> users = userRepository.findAll(predicate);

 

2. Querydsl Web Support

@QuerydslPredicate

  • 메서드 파라미터 Querydsl Predicate를 자동으로 바인딩하는 데 사용
 
 

예시

더보기
/person?firstname=Dave&lastname=Matthews
@Controller
class UserController {

  @Autowired 
  UserRepository repository;

  @RequestMapping(value = "/", method = RequestMethod.GET)
  String index(Model model, @QuerydslPredicate(root = User.class) Predicate predicate,    
               Pageable pageable, @RequestParam MultiValueMap<String, String> parameters) {

    model.addAttribute("users", repository.findAll(predicate, pageable));
    return "index";
  }
}
QPerson person = QPerson.person;
Predicate predicate = person.firstname.eq("Dave").and(person.lastname.eq("Matthews"));

 

 

QuerydslPredicateArgumentResolver
  • 요청 쿼리 문자열을 Predicate로 변환

 

 

셋팅

더보기
@Configuration
@EnableSpringDataWebSupport
public class QuerydslConfig { ... }
  • @EnableSpringDataWebSupport
    • Spring Data 웹 기능을 활성화
    • 웹 요청에서 Pageable, Sort, Predicate 등의 객체를 자동으로 바인딩

 

QuerydslBinderCustomizerDefaults

  • 기본 Querydsl 바인딩 설정

 

예제

더보기
@Configuration
@EnableSpringDataWebSupport
public class QuerydslConfig implements QuerydslBinderCustomizerDefaults {

    @Override
    public void customize(QuerydslBindings bindings, QPerson person) {
        bindings.bind(person.firstname).first((path, value) -> path.containsIgnoreCase(value));
        bindings.bind(person.lastname).first((path, value) -> path.containsIgnoreCase(value));
    }
}

 

QuerydslBinderCustomizer

  • 레포지토리별 Querydsl 바인딩 커스터마이징

예제

더보기
public interface UserRepository extends CrudRepository<User, Long>, 
                                        QuerydslPredicateExecutor<User>, 
                                        QuerydslBinderCustomizer<QUser> {

    @Override
    default void customize(QuerydslBindings bindings, QUser user) {
        // username 속성에 대한 기본 바인딩 설정
        bindings.bind(user.username).first((path, value) -> path.contains(value));

        // 모든 String 속성에 대한 기본 바인딩 설정 (대소문자 구분 없음)
        bindings.bind(String.class).first((StringPath path, String value) -> path.containsIgnoreCase(value));

        // 특정 속성 제외
        bindings.excluding(user.password);
    }
}
  • QuerydslBindings: Predicate으로 변환될 바인딩 규칙 정의

 

 

 

출처