Springboot/Thymeleaf - 如何根据 URL 执行不同的 SQL 查询?

Springboot/Thymeleaf - How to execute a different SQL query based on the URL?

我希望能够根据之前选择的类别显示不同的数据。例如,我目前有类别,点击后应将用户重定向到显示该类别所有相关信息的新页面。 url 应该类似于 localhost:8080/category/321,其中该类别的 ID 在最后。我需要找到一种方法来根据所选的 URL/category 执行不同的 sql 查询。例如,如果选择了类别 1,我希望使用类似

的语句显示类别 ID 为 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);

或使用 findAllExample. Java doc - here 一起使用的重载。

示例:

Comment comment = new Comment;
comment.setCategoryId(1);
List<Comment> comments = repository.findAll(Example.of(comment));

您需要区分控制器和存储库。控制器负责与 HTTP 和 HTML 相关的所有事情,因此解析 URL、生成 HTML 等...存储库是 class负责查询数据库。

控制器通常如下所示:

@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-methods