Spring Data JPA: получение данных с несколькими @PathVariable - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь получить конкретный заказ пользователя.


Вот как я получаю заказ пользователя s в моем OrderController

@GetMapping("/{id}/orders")
public List<Order> findAll(@PathVariable Long id) throws UserNotFoundException {
    Optional<User> existingUser = this.userRepository.findById(id);

    if (existingUser.isEmpty()) {
        throw new UserNotFoundException("User not found");
    }

    return existingUser.get().getOrders();
}

С RequestMapping

@RestController
@RequestMapping("/api/users")
public class OrderController {(...)}

Это отношение OneToMany

Пользовательский объект

// ONE TO MANY
@OneToMany(mappedBy = "user")
private List<Order> orders;

Заказ

// MANY TO ONE
@ManyToOne(fetch = FetchType.LAZY)
@JsonIgnore
private User user;

Интерфейсы UserRepository и OrderRepository расширяют JpaRepository


Мне удалось получить все заказы пользователя через Postman

enter image description here


Теперь мне интересно, как я могу получить конкретный заказ пользователя?

Так, например, как показано на изображении, скажем, я хотел бы получить только порядок с id 2, в этом конкретном адресе:

http://localhost:8070/api/users/1/orders/2

Как мне сделать это, пожалуйста?

Ответы [ 3 ]

1 голос
/ 26 мая 2020

попробуйте это,

    @GetMapping("/{userId}/orders/{orderId}")
    public Order findAll(@PathVariable Long userId, @PathVariable Long orderId) throws Exception {
        //your code
    }
1 голос
/ 26 мая 2020

Очевидно, у вас должно быть сопоставление Get:

@GetMapping("/{userId}/orders/{orderId}")
public List<Order> findAll(@PathVariable Long userId, @PathVariable Long orderId) throws UserNotFoundException {
    ...
}

И для запроса у вас есть три варианта:

  1. Позвонить вам this.userRepository.findById(id) и отфильтровать после вашего заказа.
  2. Создайте OrderRepository, чтобы ограничить запрос таблицей заказов. Но у вас должна быть ссылка на пользователя, и вы, вероятно, не улучшите производительность. Я бы не советовал это.
  3. Добавьте запрос в свой репозиторий заказов, чтобы запросить orderId для userId:

@Repository
public interface UserRepository extends JpaRepository<.., ..> {
    @Query("select ... from User user join user.orders ... where ...user = :userId and order = :orderId")
    Order getUserOrder(@Param("userId") String userId, @Param("orderId") String orderId);
}

В любом случае, вы должны создать службу и введите его в контроллер, чтобы инкапсулировать сложность поиска / фильтрации и позволить вам очистить код конечных точек (@Autowired private OrderService orderService):

@RestController
@RequestMapping("/api/users")
public class OrderController {
    @Autowired
    private OrderService orderService;
}

и:

@Service
public class OrderService {

}
1 голос
/ 26 мая 2020

Создайте конечную точку с помощью

@GetMapping("/{id}/orders/{orderId}")

и верните конкретный порядок.

Создайте OrderRepository и просто создайте метод интерфейса

public Order findByIdAndUserId(long orderId,long userId);

для получения заданного one.

Просто замечание: вы должны подтвердить, что данный пользователь совпадает с вошедшим в систему. Что произойдет, если я отправлю запрос на бэкэнд, где я перепишу идентификатор пользователя на чужой?

...