Создание собственного нативного SQL-запроса в Spring Boot с помощью Spring Data JPA. Хотел бы поискать в таблице office_products
с order_num
и вернуть связанные строки данных (в реальном мире не имеет смысла иметь несколько заказов с одинаковым номером заказа, но в этом примере давайте просто скажем 'Да, чтобы мы могли вернуть список).
Использование этого контроллера:
@Controller
public class OrderController {
@Autowired
private OrderRepository orderRepository;
@GetMapping("/test")
public String getOrderListByNum(Model model) {
List<OrderEntity> foundByOrderNo = orderRepository.getOrderByOrderNum();
model.addAttribute("foundByOrderNo", foundByOrderNo);
return "test";
}
}
Я могу успешно запросить базу данных и вернуть результат, если запрос жестко запрограммирован со значением order_num
12354
, как показано ниже:
@Repository
public interface OrderRepository extends JpaRepository<OrderEntity, OrderID> {
@Query(value ="SELECT * FROM office_products WHERE order_num=12354", nativeQuery = true)
List<OrderEntity> getOrderByOrderNum();
}
Однако, при попытке использовать параметр путем передачи значения через http://localhost:8080/test?orderNum=12354
, как показано ниже, код не работает:
@Repository
public interface OrderRepository extends JpaRepository<OrderEntity, OrderID> {
@Query(value ="SELECT * FROM office_products WHERE order_num = :orderNum", nativeQuery = true)
List<OrderEntity> getOrderByOrderNum();
}
При попытке использовать параметр я получаю обратноследующие ошибки:
@ http://localhost:8080/test?orderNum=12354
:
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Mon Oct 14 12:07:44 CDT 2019
There was an unexpected error (type=Internal Server Error, status=500).
Named parameter not bound : orderNum; nested exception is org.hibernate.QueryException: Named parameter not bound : orderNum
org.springframework.dao.InvalidDataAccessResourceUsageException: Named parameter not bound : orderNum; nested exception is org.hibernate.QueryException: Named parameter not bound : orderNum
В консоли:
[ERROR]~2019-10-14-12.07.44.569CDT~~~~~~ o.a.c.c.C.[.[.[.[dispatcherServlet] Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: Named parameter not bound : orderNum; nested exception is org.hibernate.QueryException: Named parameter not bound : orderNum] with root cause
org.hibernate.QueryException: Named parameter not bound : orderNum
Наконец, передав @Param("orderNum") String orderNum
методу List<OrderEntity> getOrderByOrderNum();
Я получаюновая ошибка:
@ http://localhost:8080/test?orderNum=12354
:
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Mon Oct 14 12:22:11 CDT 2019
There was an unexpected error (type=Internal Server Error, status=500).
Unresolved compilation problem: The method getOrderByOrderNum(String) in the type OrderRepository is not applicable for the arguments ()
java.lang.Error: Unresolved compilation problem:
The method getOrderByOrderNum(String) in the type OrderRepository is not applicable for the arguments ()
Есть идеи, что мне здесь не хватает?
ОБНОВЛЕНИЕ:
ПослеУглубившись вглубь, я понял, что мне нужно добавить следующий код в мой контроллер и, используя пример JPQL, как предложил Шаббир, теперь код работает:
@GetMapping("/test")
public String getOrderListByNum(Model model, OrderEntity orderEntity) {
List<OrderEntity> foundByOrderNo = orderRepository.getOrderByOrderNum(orderEntity.getOrderNo());
model.addAttribute("foundByOrderNo", foundByOrderNo);
return "test";
}
ОБНОВЛЕНИЕ:
И, конечно,есть решение по производному запросу:
@Repository
public interface OrderRepository extends JpaRepository<OrderEntity, OrderID> {
List<OrderEntity> findByOrderNo(String orderNo);
}