java - Spring-data 错误地形成了请求
问题描述
我有餐桌任务:
create table tasks
(
id bigserial,
title varchar(25) not null,
leader_id bigint not null,
project_id bigint not null,
deadline date not null,
primary key (id),
foreign key (leader_id) references users (id),
foreign key (project_id) references projects (id),
is_archived BOOLEAN default FALSE
);
任务休息控制器:
@GetMapping
public List<Task> getAllTasksByProjectId(@RequestParam(value = "page", defaultValue = "1") Integer page,
@RequestParam(required = false) MultiValueMap<String, String> params) {
TaskFilter taskFilter = new TaskFilter(params);
return taskService.findAllTasksByProject(taskFilter.getSpec(), page - 1, 5).getContent();
}
服务:
public Page<Task> findAllTasksByProject(Specification<Task> spec, int page, int size) {
return taskRepository.findAll(spec, PageRequest.of(page, size));
}
存储库:
@Repository
public interface TaskRepository extends JpaRepository<Task, Long>, JpaSpecificationExecutor<Task> {
}
筛选:
public TaskFilter(MultiValueMap<String, String> params) {
spec = Specification.where(null);
if (params.containsKey("is_archived")) {
spec.and(TaskSpecifications.isArchived(Boolean.parseBoolean(params.getFirst("is_archived"))));
System.out.println(params.getFirst("is_archived"));
}
if (params.containsKey("project")) {
spec = spec.and(TaskSpecifications.projectEqual(Long.parseLong(params.getFirst("project"))));
}
}
及规格:
public static Specification<Task> projectEqual(Long projectId) {
return (Specification<Task>) (root, criteriaQuery, criteriaBuilder) -> criteriaBuilder.equal(root.get("project"), projectId);
}
public static Specification<Task> isArchived(Boolean isArchived) {
return (Specification<Task>) (root, criteriaQuery, criteriaBuilder) -> criteriaBuilder.equal(root.get("isArchived"), isArchived);
}
所以我想得到所有is_archived = true或false的任务。但我得到了所有的任务。例如获取请求
本地主机:8189/tm/api/v1/tasks?page=1&is_archived=false
返回 is_archived = true 和 false 的任务。可能是什么问题?
解决方案
我在这一行有错误:
spec.and(TaskSpecifications.isArchived(Boolean.parseBoolean(params.getFirst("is_archived"))));
每次我创建新规范时,而不是添加旧规范。
spec = spec.and(TaskSpecifications.isArchived(Boolean.parseBoolean(params.getFirst("is_archived"))));
推荐阅读
- python - 我在 jupyter notebook python 上使用天气预报代码
- java - Kotlin:在扩展类之间共享抽象类中的变量
- reactjs - contentComponents 在本机反应中不起作用
- c# - 数字出现在二维数组中的次数
- shiny - 侧边栏中的过滤选项
- python - 将csv加载到数据库时如何在try except块中多次捕获单个异常
- shell - 如何使用 awk sed 或 cut 命令在匹配模式后打印一行
- android - Android Studio 上的对象返回 ID Null
- c++ - 如何在 do-while 循环中使用 getline?
- linux - 如何通过终端检查 Linux 机器中的互联网连接