Обработка параметров в пользовательском запросе Spring Data JPA - PullRequest
0 голосов
/ 14 октября 2019

Создание собственного нативного 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);
} 

1 Ответ

1 голос
/ 14 октября 2019

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

@Query(value ="SELECT * FROM order_entity WHERE order_num = :orderNum", nativeQuery = true)

List<OrderEntity> getOrderByOrderNum(@Param(value="orderNum") String orderNum);

Лучше использовать JPQL вместо собственного запроса, который будет выглядеть так:

@Query("SELECT op FROM OrderEntity op WHERE orderNum = :orderNum")

List<OrderEntity> getOrderByOrderNum(@Param(value="orderNum") String orderNum);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...