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的作业。现在也应该加载以下所有作业。如何做到这一点?