繁体   English   中英

Spring + JPA + SQL 视图

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM