如果我有几个实体,可以说:
@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查找什么和返回什么?我不知道的任何链接,指南或方法,将不胜感激。
答案 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。进一步了解:
答案 1 :(得分:0)
例如参见: https://vladmihalcea.com/eager-fetching-is-a-code-smell/