HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🤩
개발
/
Spring Data
Spring Data
/
🧣
JPA(Java Persistence API)
/
🚂
Query Method & 정렬
🚂

Query Method & 정렬

Query Method Predicate keywords정렬Derived Delete MethodsQueryMethodModifying JPQL비교
 
public interface UserRepository extends JpaRepository<User, Long> { List<User> findByName(String name); // return type을 개발자가 자유롭게 지정가능함 Optional<User> findByCategoryId(Long categoryId) // 이것도 가능함 //! User가 Category entity 가지고 있을 때. Category 엔티티의 @Id 필드의 이름이 id List<User> findByIdIn(List<Integer> id); List<User> findAllByOrderByNameDesc(); Optonal<User> findTopByOrderByAgeDesc(); List<User> findFirst10ByLastname(String lastname, Sort sort); }
  • [참고]
    • Supported Query return type
    • Supported query method subject keywords
    • [ Spring Data Jpa ] JPA Query Methods
    • find...By 라고 되어있음. find뒤에 Table이름 넣어도됨
  • queryMethod 쓸 때는 테스트 코드 꼭 작성하기!

Query Method Predicate keywords

  • After, Before : 시간에 대해 적용
  • Between : 왼쪽 오른쪽 둘다 inclusive임
  • IS_NOT_EMPTY : Collection 타입에 대해 적용되는 로직임. String에 적용되는건 아님(String name is not null & name ≠ “” → 이것 아님)
  • In : 사용 시 해당하는 in 파라미터가 얼마나 큰 사이즈가 들어가는지 확인하고 사용하는 것이 좋음(성능이슈)
  • LIKE (Contain

정렬

List<User> findTop1ByNameOrderByIdDescEmailAsc(String name); // 이런식으로 정의하는방법 // 이 메써드가 계속 반복된다면 아래처럼 Sort를 계속 쓰는것보다는 위 메써드로 정의해서 사용 // 하는 것이 더 나음 userRepository.findFirstByName( "martin", Sort.by(Sort.Order.desc("id"), Sort.Order.asc("email"))) // 이 방법이 코드 가독성 측면에서 장점. 그리고 더 자유도 높게 sort 가능함

Derived Delete Methods

[ Baeldung ] Spring Data JPA — Derived Delete Methods
💡
2가지 방식이 있는데, 두 메서드 다 사용할때는 @Transactional 어노테이션이 붙어야 함
 

QueryMethod

  • 위의 쿼리 메서드 작성방식과 동일하게 삭제에 대한 것도 메서드를 만들 수는 있음
@Entity public class Fruit { @Id private long id; private String name; private String color; // standard getters and setters } @Repository public interface FruitRepository extends JpaRepository<Fruit, Long> { Long deleteByName(String name); List<Fruit> deleteByColor(String color); Long removeByName(String name); List<Fruit> removeByColor(String color); }
 

Modifying JPQL

@Modifying @Query("delete from Fruit f where f.name=:name or f.color=:color") List<int> deleteFruits(@Param("name") String name, @Param("color") String color);

비교

QueryMethod 방식
PQL 방식
조회 후, delete 쿼리가 날아감
delete 쿼리를 바로 날림.
삭제된 레코드의 리스트를 반환 가능
삭제된 레코드의 갯수만 반환 가능