Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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 如何使用SpringDataJPA保存和加载有序数据?_Java_Spring_Jpa - Fatal编程技术网

Java 如何使用SpringDataJPA保存和加载有序数据?

Java 如何使用SpringDataJPA保存和加载有序数据?,java,spring,jpa,Java,Spring,Jpa,我有一个适用于不同工作的应用程序。作业由接口描述,如下所示: public interface Job { void start(); String getName(); void setName(String name); // Getters and setters for other properties } +----+-------------+-------+-----------+ | id | preceder_id | name |

我有一个适用于不同工作的应用程序。作业由接口描述,如下所示:

public interface Job {

    void start();

    String getName();

    void setName(String name);

    // Getters and setters for other properties

}
+----+-------------+-------+-----------+
| id | preceder_id | name  | others... |
+----+-------------+-------+-----------+
|  1 | null        | Job 1 | ...       |
|  2 | 1           | Job 2 | ...       |
|  3 | 2           | Job 3 | ...       |
+----+-------------+-------+-----------+
作业将持久保存在数据库中。现在需要按顺序执行某些作业组。 当我在程序中创建作业时,没有问题,因为作业被放入队列中。 但是当我重新创建持久化作业时,我没有关于原始顺序的信息

我考虑添加另一个名为preceder的成员来存储前面的作业。这会给我一个类似于链表的东西,我可以这样修改表:

public interface Job {

    void start();

    String getName();

    void setName(String name);

    // Getters and setters for other properties

}
+----+-------------+-------+-----------+
| id | preceder_id | name  | others... |
+----+-------------+-------+-----------+
|  1 | null        | Job 1 | ...       |
|  2 | 1           | Job 2 | ...       |
|  3 | 2           | Job 3 | ...       |
+----+-------------+-------+-----------+

但是我如何使用Spring数据JPA和JPARepository来获得这样一个组的有序列表呢?

您可以使用自连接来映射它:

@Table(name = "JOB")
public class Job implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO) //or some other strategy
    private Long id;

    @OneToOne()
    @JoinColumn(name = "preceder_id")
    private Job previousJob;
}
假设您可以加载链中的最后一个作业,那么您应该能够执行某种递归调用链

Job job = loadJobFromDB();
runJob(job);

public void runJob(Job Job){
    if(job.getPreviousJob() != null){
        runJob(job.getPreviousJob());
    }

    job.start();
}

其他选项是更改您的模式,为组中的每个作业添加作业组和作业序列。

hmm您不能只使用OrderBy方法名称支持吗?是的,我认为这会起作用,但首先我必须获得整个组。或者我可以换一种方式来做,说每个作业都可以有一个后续作业,然后Spring/Hibernate会自动加载下一个作业吗?我必须如何对此进行注释?在我看来,最好是对表中的数据进行排序。通过这种方式,每当您获取数据时,您都会按照您的顺序对其进行排序。排序不是我真正的问题。我的问题是,我不知道如何接收属于同一组的工作。例如:我只知道工作1。因此,我选择id等于1的作业。现在也应该加载以下所有作业。如何做到这一点?