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