Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅筛选查询结果,而不筛选整个表_Java_Spring_Spring Boot_Spring Data Jpa - Fatal编程技术网

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)#将从所有任务中筛选已完成的任务 任务=任务。筛选(完成的任务时间=开始日期,完成的日期=结束日期)#将根据完成日期筛选完

我是春天的新手,我正在尝试做类似的事情。假设我的表有以下列

  • 任务
  • 完成了吗
  • 完成
  • 用户将在查询参数中提供以下选项

  • 是否完成=正确或错误
  • 起始日期=年月日
  • 截止日期=年月日
  • 我将逐个检查每个参数,然后筛选表

    在Django,我可以做这样的事情

    
    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.然后你需要根据用户输入过滤数据。是的,这正是我要做的。我的回答解决了你的问题吗?如果是,请接受答案