728x90
- 최근 개발하면서 가장 상위에 있는 한개의 로우의 id 값을 id순으로 역순으로 정렬한뒤 가져오는 쿼리를 짜서 작업을 하려고 다음과 같이 쿼리문을 작성해서 JPQL을 사용하려고 했는데, 오류가 발생했다.
-- mariaDB 기준
select id from table order by id desc limit 1;
- 찾아보니 JPQL은 limit 명령어를 지원하지 않는다고 해서, 구글을 좀 뒤져보니 쉽게 해결방법을 찾을 수 있었다.
- Spring JPA에서도 결과를 제한하는 기능을 제공하고 있었고, 나의 경우는 다음 문서를 참고했다. (Spring JPA Doc)
Spring Data JPA - Reference Documentation
Example 108. Using @Transactional at query methods @Transactional(readOnly = true) public interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") v
docs.spring.io
대충 정리하면 Spring JPA에서 쿼리 결과를 제한하는 기능은 first와 Top을 이용하면 되고 코드는 다음과 같이 작성하면 된다.
public interface EntityRepository extends JpaRepository<Entity, Long> {
// Entity 테이블을 id역순으로 정렬한 뒤 첫 로우리턴
// 두메소드의 결과 값은 동일하다.
Entity findFirstByOrderByIdDesc();
Entity findTop1ByOrderByIdDesc();
}
- 위의 링크가 걸려있는 문서를 참조하는게 더 빠르겠지만, 간단히 설명하면 FirtstvalueBy 메소드에서 value 부분에 제한하고 싶은 개수를 입력해주면 된다. 아무것도 입력하지 않으면 1개의 로우만 리턴된다. 밑의 Top이 포함되는 메소드도 동일하게 사용할 수 있다.
- 이외에 Spring Page 자료형을 이용하던가 List자료형으로 받아서 해결하는 방법이 있긴하지만 이왕이면 제공되는 방식으로 깔끔하게 작성하는게 좋은 것 같다.
출처: https://www-swpro-com.tistory.com/46 [Share the knowledge:티스토리]
728x90
'JPA' 카테고리의 다른 글
Java8 Optional 의 ifPresent 활용 (2) | 2022.09.01 |
---|---|
@Transactional(rollbackFor = Exception.class) 에 대해 (0) | 2022.08.26 |
페이징 한계돌파 시, ToMany 관계를 Entity -> DTO로 표현하는 방법 (0) | 2022.07.14 |
JPA 낙관적 락(부제 - OPTIMISTIC) (0) | 2022.06.22 |
@CreatedBy, @ModifiedBy 사용하기 (0) | 2022.06.21 |