用SQL替换视图的Spring Boot方法

时间:2017-06-12 18:57:58

标签: sql jpa spring-boot spring-data-jpa

上下文

我继承了一个基于Spring的小项目 - 跟踪服务器,软件安装等,或团队内部使用。它使用Angular前端和Spring / java / mysql后端来实现一个宁静的后端。

我在过去几个月里将它转换为Spring引导。我是Spring和Spring的新手。所以我一直在学习。

我开始更换手动编码'带有JPA的sql(" spring-data-rest")。对于某些表格,JPA很容易,但对其他表格则不然。对于这些"其他":手工编写的SQL使用"视图"检索数据时。

方法

具体来说,它使用这种方法:

  • 当它创建或更新表格时(例如"网站"表格,如"网站"),它会传入" ID' S:" Server_id,product_id,customer_id等

  • 软件从"网站视图"加入服务器,产品和客户表,以便java可以检索服务器名称,产品名称,客户名称等,而无需单独的数据库调用。

问题

  • 转换这些"只读视图"最干净,最弹簧启动方式是什么?到JPA?

  • 处理星形连接的最简洁方法是什么?'在Spring / JPA? (其中一个中心表与其他几个表连接以向用户提供他/她需要的数据)

感谢

1 个答案:

答案 0 :(得分:2)

我假设您可以使用通常的projectionnative query来获取视图中的数据。像这样:

public interface ViewResult {
    String getField1();
    Integer getField2();
    Double getField3();
    //...
}

public interface SomeRepository extends JpaRepository<SomeEntity, Long> {
    @Query(value = "select v.field1 as field1, v.field2 as field2, v.field3 as field3 from some_view v", nativeQuery = true)
    List<ViewResult> getViewResult();
}

要处理复杂查询,您还可以使用投影:

@Query("select a as abc, b as bcd, c as cde from Abc a join a.bcd b join a.cde c")
List<AbcBcdCde> getComplexData();

其中AbcBcdCde是投影:

public interface AbcBcdCde {
    Abc getAbc();
    Bcd getBcd();
    Cde getCde();
}