Я хотел бы иметь возможность отображать разные данные на основе предыдущей выбранной категории. Например, в настоящее время у меня есть категории, которые после нажатия должны перенаправить пользователя на новую страницу, которая отображает всю соответствующую информацию для этой категории. URL-адрес должен выглядеть примерно так: localhost:8080/category/321
, где идентификатор этой категории является последним. Мне нужно найти способ выполнить другой запрос sql в зависимости от выбранного URL/категории. Например, если выбрана категория 1, я бы хотел, чтобы все комментарии с идентификатором категории 1 отображались с помощью оператора, подобного
SELECT * FROM Comments WHERE CategoryID='the category id of the category that was selected';
Я использовал метод findAll() в другом месте своего приложения для отображения всех данных, но не знаю, как выполнять определенные запросы на основе URL-адреса. Я также кратко изучил findByID()
Спасибо
Вы можете добавить дополнительные методы в свои репозитории. Для вашего случая что-то вроде:
List<Comment> findByCategoryID(Long categoryId);
Spring разрешит запрос, используя имя метода.
Или с jpql:
@Query("SELECT c FROM Comment AS c WHERE c.CategoryID = :categoryId")
List<Request> findByCategoryID(Long categoryId);
Или используйте перегрузку findAll
, которая работает с Пример. Документ Java — здесь.
Пример:
Comment comment = new Comment;
comment.setCategoryId(1);
List<Comment> comments = repository.findAll(Example.of(comment));
@JohnSA Вы получаете идентификатор, используя @PathVariable
из URL-адреса - проверьте здесь, как это сделать. Затем передайте значение выбранному вами методу репозитория.
Вам нужно провести различие между вашим контроллером и вашим репозиторием. Контроллер отвечает за все, что связано с HTTP и HTML, поэтому синтаксический анализ URL, создание HTML и т. д. Репозиторий — это класс, отвечающий за запросы к базе данных.
Контроллер обычно выглядит так:
@Controller
@RequestMapping("/comments")
public class CommentsController {
@GetMapping
public String listAllComments(Model model) {
// Normally, you don't go directly to the repository,
// but use a service in between, but I show it like this
// to make a bit easier to follow
List<Comment> comments = repository.findAll();
model.addAttribute("comments", comments);
return "index"; // This references the Thymeleaf template. By default in a Spring Boot appliation, this would be `src/main/resources/templates/index.html`
}
@GetMapping("/{id}"
public String singleComment(@PathVariable("id") Long id, Model model) {
// Spring will automatically populate `id` with the value of the URL
// Now you can use the id to query the database
Comment comment = repository.findById(id).orElseThrow();
model.addAttribute("comment", comment);
return "single-comment";
}
}
Этот второй метод будет обрабатывать URL-адрес формы /comments/123
.
В вашем примере, если у комментариев есть категория, то, скорее всего, вы бы использовали параметр запроса, а не переменную пути. В этом случае ваш метод контроллера будет:
@GetMapping
public String commentsByCategory(@QueryParameter("categoryId")Long categoryId, Model model) {
List<Comments> comments = repository.findAllByCategoryId(categoryId);
model.addAttribute("comments", comments);
return "comments-by-category";
}
Тогда URL будет /comments?categoryId=123
Что касается самого репозитория, обязательно ознакомьтесь с методами запросов в документации: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-методы
Спасибо, при использовании jpql он получает идентификатор категории из URL-адреса? Итак, если бы я изменил URL-адрес на другой идентификатор, он выполнил бы другой запрос?