Java 仅筛选查询结果,而不筛选整个表
我是春天的新手,我正在尝试做类似的事情。假设我的表有以下列Java 仅筛选查询结果,而不筛选整个表,java,spring,spring-boot,spring-data-jpa,Java,Spring,Spring Boot,Spring Data Jpa,我是春天的新手,我正在尝试做类似的事情。假设我的表有以下列 任务 完成了吗 完成 用户将在查询参数中提供以下选项 是否完成=正确或错误 起始日期=年月日 截止日期=年月日 我将逐个检查每个参数,然后筛选表 在Django,我可以做这样的事情 tasks=Task.object.all()#所有任务都将存储在tasks中 任务=任务。筛选(is_completed=True)#将从所有任务中筛选已完成的任务 任务=任务。筛选(完成的任务时间=开始日期,完成的日期=结束日期)#将根据完成日期筛选完
tasks=Task.object.all()#所有任务都将存储在tasks中
任务=任务。筛选(is_completed=True)#将从所有任务中筛选已完成的任务
任务=任务。筛选(完成的任务时间=开始日期,完成的日期=结束日期)#将根据完成日期筛选完成的任务
如何使用spring JPA实现这一点。是否有任何方法可以保存筛选结果并再次查询筛选结果,而不是查询整个数据库
这样我就可以检查参数是否有任何值,并像这样检查它
如果(完成=真){
//筛选已完成的任务
}
如有(自年月日起){
//筛选在此日期或之后完成的已完成任务
}
如果(截止日期){
//筛选在此日期之前已完成的已完成任务
}
当前方法的问题是,我必须为每个组合编写SQL查询。当有多个参数时,这会变得复杂。
让我们考虑这是您的任务类。
class Task {
private String id;
private boolean isCompleted;
private LocalDate isCompletedAt;
public Task(String id, boolean isCompleted, LocalDate isCompletedAt) {
this.id = id;
this.isCompleted = isCompleted;
this.isCompletedAt = isCompletedAt;
}
public boolean isCompleted() {
return isCompleted;
}
public LocalDate getCompletedAt() {
return isCompletedAt;
}
@Override
public String toString() {
return "Task{" +
"id='" + id + '\'' +
", isCompleted=" + isCompleted +
", isCompletedAt=" + isCompletedAt +
'}';
}
}
以下是可用于筛选数据的代码:
class TaskFilter {
public static void main(String[] args) {
// Sample user input
boolean isCompleted = true;
LocalDate fromDate = LocalDate.parse("2020-11-04");
LocalDate toDate = LocalDate.parse("2021-11-06");
// Simulate data retrieved from JPA repository eg repository.findAll()
List<Task> tasks = List.of(
new Task("1", true, LocalDate.parse("2020-10-04")),
new Task("2", false, LocalDate.parse("2010-12-02")),
new Task("3", false, LocalDate.parse("2021-04-24")),
new Task("4", true, LocalDate.parse("2021-03-12"))
);
// Create a stream on retrieved data
Stream<Task> tasksStream = tasks.stream();
// Filter that stream based on user input
if(isCompleted) {
tasksStream = tasksStream.filter(task -> task.isCompleted());
}
if(fromDate != null) {
tasksStream = tasksStream.filter(task -> task.getCompletedAt().isAfter(fromDate));
}
if(toDate != null) {
tasksStream = tasksStream.filter(task -> task.getCompletedAt().isBefore(toDate));
}
// Finally collect that in a list. This is a must operation, because stream is not executed unless terminal operation is called.
List<Task> filteredTaskList = tasksStream.collect(Collectors.toList());
System.out.println(filteredTaskList);
}
}
类任务过滤器{
公共静态void main(字符串[]args){
//用户输入示例
布尔值isCompleted=true;
LocalDate fromDate=LocalDate.parse(“2020-11-04”);
localdatetodate=LocalDate.parse(“2021-11-06”);
//模拟从JPA存储库中检索的数据,例如repository.findAll()
List tasks=List.of(
新任务(“1”,true,LocalDate.parse(“2020-10-04”),
新任务(“2”,false,LocalDate.parse(“2010-12-02”),
新任务(“3”,false,LocalDate.parse(“2021-04-24”),
新任务(“4”,true,LocalDate.parse(“2021-03-12”))
);
//在检索到的数据上创建流
Stream tasksStream=tasks.Stream();
//根据用户输入过滤该流
如果(已完成){
tasksStream=tasksStream.filter(任务->任务.isCompleted());
}
if(fromDate!=null){
tasksStream=tasksStream.filter(task->task.getCompletedAt().isAfter(fromDate));
}
如果(toDate!=null){
tasksStream=tasksStream.filter(task->task.getCompletedAt().isBefore(toDate));
}
//最后在列表中收集它。这是一个必须的操作,因为除非调用终端操作,否则不会执行流。
List filteredTaskList=tasksStream.collect(Collectors.toList());
System.out.println(filteredTaskList);
}
}
参数是强制性的吗?不,参数不是强制性的。这就是为什么我将使用“如果条件”检查是否提供了参数值。您能否确认我的理解:1。您需要从数据库中获取数据。2.然后你需要根据用户输入过滤数据。是的,这正是我要做的。我的回答解决了你的问题吗?如果是,请接受答案