Java Spring+JPA+SQL视图
我已经看到JPA支持使用视图而不是表。 我们的DBA告诉我们,我们需要为不同种类的东西使用特定的视图,例如:一个视图用于选择,另一个视图用于插入,另一个视图用于更新 目前,我有一个实体和一个与特定表相关的JPA存储库 我的问题是: 我应该如何处理这些新视图? 我应该为每个视图创建一个实体吗? 是否有一种方法可以将一个实体映射到多个JPA存储库,其中每个存储库都与不同的视图相关Java Spring+JPA+SQL视图,java,spring,hibernate,spring-data-jpa,Java,Spring,Hibernate,Spring Data Jpa,我已经看到JPA支持使用视图而不是表。 我们的DBA告诉我们,我们需要为不同种类的东西使用特定的视图,例如:一个视图用于选择,另一个视图用于插入,另一个视图用于更新 目前,我有一个实体和一个与特定表相关的JPA存储库 我的问题是: 我应该如何处理这些新视图? 我应该为每个视图创建一个实体吗? 是否有一种方法可以将一个实体映射到多个JPA存储库,其中每个存储库都与不同的视图相关 谢谢 如果您使用这种方法,那么每个视图都会有JPA实体,而不是表,您的代码将不知道数据是如何存储的,对于每个实体,您的存
谢谢 如果您使用这种方法,那么每个视图都会有JPA实体,而不是表,您的代码将不知道数据是如何存储的,对于每个实体,您的存储库也不会有任何改变 链接到有关视图的文档:
我使用的是Spring Boot,也有同样的问题。我有一个视图,它从各种Spring批处理表中获取各种字段,以显示用户运行的作业的状态。经过一些试验后,以下各项起了作用:
@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);
}
所以,现在我有了:-1个名为Test-1JPA存储库的实体,名为TestJPA-1DB表,名为Test。您是在建议我必须为每个视图创建一个实体吗?类似于:-3个视图testSelect、TestUpdate和TestInsert-1个名为Test的DB表-我们不关心这个-3个与三个视图testSelect、TestUpdate和TestInsert相关的实体3 JPA存储库是否正确?理论上是的,但大多数此类解决方案都用于这样的情况:在UI中,您的数据是多个表的组合,而不是复杂的SQL查询,您创建单独的视图或多个视图来更新数据,并创建单独的视图来获取数据。我对SQL视图了解不多,但是您所描述的不同种类的特定视图听起来很像RESTful API。我可以告诉你,我们有一个单独的视图服务器,每个实体更新/创建/选择一个操作都有一个API。。。。我们为每个实体使用DTO模式,以确保服务逻辑和存储库逻辑之间的分离。JPA用于将数据库结构映射到服务逻辑。存储库是连接到数据库的方法,在呈现数据库之前,您可能会调用多个存储库views@jrhee17我有一个带DTO模式的RESTful API。我还有一个映射器,可以将DTO映射到实体。问题是实体不会与表相关,因为我必须使用不同的视图来保存、更新和获取。也许JPA不打算以这种方式使用,我真的不知道。