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> findById(Predicate predicate);  
  Iterable<T> findAll(Predicate predicate);   
  long count(Predicate predicate);            
  boolean exists(Predicate predicate);        
  // … more functionality omitted.
}

 

Definition
interface UserRepository extends JpaRepository<User, Long>, QuerydslPredicateExecutor<User> {
}

 

Use
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

QuerydslPredicateArgumentResolver

  • 요청 쿼리 문자열에서 Predicate로 변환
?firstname=Dave&lastname=Matthews

 

Setting
  • @EnableSpringDataWebSupport
  • QuerydslBinderCustomizerDefaults: 기본 Querydsl 바인딩 설정

 

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으로 변환될) 바인딩 규칙 정의
 

@QuerydslPredicate

  • 준비된 Predicate 제공 (method signature)
@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";
  }
}
 

 

 

 

출처