Spring Data-如何告诉Spring检索哪些实体

时间:2019-05-14 12:08:18

标签: spring hibernate jpa spring-data

如果我有几个实体,可以说:

@Entity
class Book{
String name;
Author author; 
}

@Entity
class Author{
String name;
City hometown;
}

@Entity
class City{
String cityName;
}

如果我想检索所有书籍,如果我使用经典的JPA信息库和Spring Data并执行findAll(),它将为我带来所有作者以及所有家乡的所有书籍。我知道我可以使用@JsonIgnore,但我认为这只能防止返回什么,而不能防止在数据库中查找到什么。另外,我有一些方法都希望同时返回书籍和作者,因此@JsonIgnore -ing对我不起作用。有这样的东西吗?告诉Spring Data查找什么和返回什么?我不知道的任何链接,指南或方法,将不胜感激。

2 个答案:

答案 0 :(得分:1)

Spring Data具有“投影”的概念,可让您返回同一实体的不同表示形式。

官方文档:

  

Spring Data查询方法通常返回一个或多个实例   存储库管理的聚合根。但是,可能   有时希望根据某些   这些类型的属性。 Spring Data允许建模专用   返回类型,以更选择性地检索   托管聚合。

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections

如果Projection是“封闭的”投影(投影接口的访问器方法均与目标集合的属性完全匹配),则文档会另外指出:

  

Spring Data可以优化查询执行[仅选择相关字段],因为我们知道   支持投影代理所需的所有属性

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections.interfaces.closed

Spring Data还允许在运行时动态指定Projection。进一步了解:

https://github.com/spring-projects/spring-data-commons/blob/master/src/main/asciidoc/repository-projections.adoc#dynamic-projections

答案 1 :(得分:0)

  • 首先将您的关系标记为LAZY
  • 然后指定每个查询需要获取哪些数据。

例如参见: https://vladmihalcea.com/eager-fetching-is-a-code-smell/