#sql #spring #database #jpa #h2
#sql #spring #База данных #jpa #h2
Вопрос:
У меня есть приложение Spring Boot, использующее Spring Data JPA в соединении с базой данных H2. Я попытался написать @Query
метод в одном из своих JpaRepositories
, но он всегда возвращает пустую коллекцию, и я не знаю почему.
public interface ProductService extends JpaRepository<Product, Long> {
@Query(value = "SELECT * FROM product WHERE category=':category'", nativeQuery = true)
List<Product> getCategory(@Param("category") String category);
}
Я поместил этот код выше только потому, что уверен, что данные присутствуют в базе данных. Я проверил это, запустив точно такой же запрос из H2-console, и он работает каждый раз. В чем здесь может быть проблема?
Комментарии:
1. Вам не обязательно содержать переменную, помеченную @param внутри кавычек. Удалите кавычки. Итак, предложение where выглядит следующим образом
where category=:category
Ответ №1:
Использование чистого JPA:
List<Product> findAllByCategory(String category);
Использование собственного запроса:
@Query(value="SELECT * FROM product WHERE category=?1;",nativeQuery=true)
List<Product> getAllByCategory(String category);
@Query(value="SELECT * FROM product WHERE category=:category;",nativeQuery=true)
List<Product> getAllByCategory(@Param String category);
Лично я бы использовал версию JPA, поскольку вы, возможно, в будущем захотите использовать конечную точку подкачки Spring, поэтому захотите передать Pageable
параметр в репозиторий.
List<Product> findAllByCategory(String category,Pageable page);
Комментарии:
1. Я не думаю, что есть что-то неправильное в том, как он передает параметры. Это кавычки
Ответ №2:
Вы пробовали
@Query(value = "SELECT * FROM product p WHERE p.category=:category", nativeQuery = true)
Ответ №3:
Вы можете попробовать, указав псевдоним для таблицы и выбрав то же имя псевдонима вместо *, как показано ниже
@Query(value = "SELECT p FROM Product p WHERE p.category = :category")
List<Product> getCategory(@Param("category") String category);