Springboot/Thymeleaf - Как выполнить другой SQL-запрос на основе URL-адреса?

Я хотел бы иметь возможность отображать разные данные на основе предыдущей выбранной категории. Например, в настоящее время у меня есть категории, которые после нажатия должны перенаправить пользователя на новую страницу, которая отображает всю соответствующую информацию для этой категории. 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() Спасибо

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете добавить дополнительные методы в свои репозитории. Для вашего случая что-то вроде:

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));

Спасибо, при использовании jpql он получает идентификатор категории из URL-адреса? Итак, если бы я изменил URL-адрес на другой идентификатор, он выполнил бы другой запрос?

JohnSA 21.03.2022 19:11

@JohnSA Вы получаете идентификатор, используя @PathVariable из URL-адреса - проверьте здесь, как это сделать. Затем передайте значение выбранному вами методу репозитория.

Chaosfire 21.03.2022 22:30

Вам нужно провести различие между вашим контроллером и вашим репозиторием. Контроллер отвечает за все, что связано с 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-методы

Другие вопросы по теме