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 쿼리를 바로 날림. |
삭제된 레코드의 리스트를 반환 가능 | 삭제된 레코드의 갯수만 반환 가능 |