[英]Spring + JPA + SQL Views
我已经看到 JPA 支持使用视图而不是表。 我们的 DBA 告诉我们,我们需要为不同种类的东西使用特定的视图,例如:一个视图用于 SELECT,另一个视图用于 INSERT,另一个用于 UPDATE。
目前,我有一个实体和一个与特定表相关的 JPA 存储库。
我的问题是:我应该如何处理这些新观点? 我应该为每个视图创建一个实体吗?
有没有办法将一个实体映射到多个 JPA 存储库,其中每个存储库都与不同的视图相关?
谢谢!
我使用Spring Boot并遇到了同样的问题。 我有一个视图,从各种Spring Batch表中获取各种字段,以显示用户运行的作业的状态。 经过一些实验,以下工作:
@Entity
public class Job {
@Id
@Column(name = "JOB_INSTANCE_ID")
private String jobInstanceId;
@Column(name = "JOB_EXECUTION_ID")
private String jobExecutionId;
@Column(name = "JOB_NAME")
private String jobName;
@Column(name = "JOB_TYPE")
private String jobType;
@Column(name = "START_TIME")
private Date startTime;
@Column(name = "END_TIME")
private Date endTime;
@Column(name = "STATUS")
private String status;
@Column(name = "USERNAME")
private String username;
public String getJobInstanceId() {
return jobInstanceId;
}
public void setJobInstanceId(String jobInstanceId) {
this.jobInstanceId = jobInstanceId;
}
public String getJobName() {
return jobName;
}
public void setJobName(String jobName) {
this.jobName = jobName;
}
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getJobType() {
return jobType;
}
public void setJobType(String jobType) {
this.jobType = jobType;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getJobExecutionId() {
return jobExecutionId;
}
public void setJobExecutionId(String jobExecutionId) {
this.jobExecutionId = jobExecutionId;
}
}
和存储库定义:
public interface JobsRepository extends JpaRepository<Job, String> {
@Query(value = "SELECT JOB_INSTANCE_ID, JOB_EXECUTION_ID, JOB_NAME, JOB_TYPE, START_TIME, END_TIME, STATUS, USERNAME FROM JOBS_VW", nativeQuery = true)
List<Job> getAll();
@Query(value = "SELECT JOB_INSTANCE_ID, JOB_EXECUTION_ID, JOB_NAME, JOB_TYPE, START_TIME, END_TIME, STATUS, USERNAME FROM JOBS_VW WHERE JOB_INSTANCE_ID=?1", nativeQuery = true)
List<Job> getJobsByInstanceId(String instanceId);
}
如果你将使用这种方法,你将为每个视图使用JPA实体而不是表,你的代码将不知道数据如何真正存储,并且对于你将拥有存储库的每个实体,任何东西都不会改变你的身边。
链接到有关视图的文档: https : //en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Views
首先澄清一点:存储库是Spring Data的东西(从概念上来说,来自Domain Driven Design)JPA不知道存储库。
我不认为你想做什么可以用JPA来实现。 JPA的整个想法是,您描述了POJO及其属性如何映射到一组表及其列,然后让JPA找出要使用的确切语句。
您可以设置两个持久化上下文,一个用于读取,一个用于写入, 但在JPA发出更新语句之前,它将在同一个表上执行选择,至少可以验证id是否存在。 你的分离就这样了。 即使有办法实现这一点,它也会使JPA达到极限(并且在我看来超出其极限)。
我,推荐两种方法之一:
与您的DBA交谈,以了解她想要实现的基本目标。 这可能以完全不同的方式实现。
忘记JPA并考虑例如MyBatis,如果您需要对SQL进行如此精确的控制,这可能是一个更好的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.