본문 바로가기

Various Error

[Spring Data JPA] PropertyReferenceException 에러

JPA의 Pagination을 사용하려는데 계속 아래와 같은 에러가 발생하였음

 

org.springframework.data.mapping.PropertyReferenceException: No property 'orders' found for type 'Orders'; Did you mean 'ordersId'

 

 

Orders 엔티티

@Entity
@NoArgsConstructor
@AllArgsConstructor
public class Orders extends BaseTime {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long ordersId;

    private String orderNumber;

    private int totalPrice;

    @Enumerated(EnumType.STRING)
    private OrdersStatus orderStatus;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
    private Member member;
}

 

OrdersRepository

@Repository
public interface OrdersRepository extends JpaRepository<Orders, Long> {
    Page<Orders> findAllByMember_MemberId(Long memberId, Pageable pageable);
}

 


1. 쿼리 메서드 의심

처음에는 JPA Query Method에서 Orders의 필드 중 객체로 저장된 member Long 자료형의 memberId와 비교하려 하는 것이 문제인 줄 알고 아래처럼 여러 쿼리 메서드를 시도하였으나, 모두 같은 에러가 발생

@Repository
public interface OrdersRepository extends JpaRepository<Orders, Long> {
    Page<Orders> findAllByMember(Long memberId, Pageable pageable);
    Page<Orders> findAllByMember_Id(Long memberId, Pageable pageable);
    Page<Orders> findAllByMember_MemberId(Long memberId, Pageable pageable);
}

 

 

2. 기본 메서드도 작동하지 않는 지 확인

JpaRepository에 있는 기본 findAll() 메서드도 정상적으로 작동하였는데, findAll()에 pageable을 넣었더니 같은 에러 발생

public List<OrdersGameResponseDto> allList(Long memberId, int pageNo, int size) {
    Pageable pageable = PageRequest.of(pageNo, size, Sort.by(Sort.Direction.DESC, "orders_id"));
//        Page<Orders> page = ordersRepository.findAllByMember_MemberId(memberId, pageable);
    System.out.println(ordersRepository.findAll()); // 정상 실행
    Page<Orders> page = ordersRepository.findAll(pageable); // 에러 발생
    System.out.println(page);
    return List.of();
}

 

3. Pageable에 문제가 있다고 생각되어 Pageable PropertyReferenceException로 구글링하여 동일한 문제를 해결한 블로그를 찾음

  • 나도 마찬가지로 Orders 엔티티에 orders는 어디서 튀어나온 필드인가 의아했음
  • 아래의 블로그에 의하면 JPA에서는 변수명을 자동으로 해석하여 매핑하는데 변수명에서 언더바(_)와 같은 접미사는 관례적으로 외래키(ForeignKey)를 의미하는 컬럼으로 간주하여, orders_id를 orders로 인식을 한다고 함
  • PageRequest.of()에서 정렬하는 값 orders_id를 ordersId로 변경하여 문제 해결
public List<OrdersGameResponseDto> allList(Long memberId, int pageNo, int size) {
    Pageable pageable = PageRequest.of(pageNo, size, Sort.by(Sort.Direction.DESC, "ordersId"));
//        Page<Orders> page = ordersRepository.findAllByMember_MemberId(memberId, pageable);
    System.out.println(ordersRepository.findAll()); // 정상 실행
    Page<Orders> page = ordersRepository.findAll(pageable); // 정상 실행
    System.out.println(page);
    return List.of();
}

 

 

https://clin0927.tistory.com/74