在存储库中有或没有显式声明的Spring Data Rest Projections

for*_*rtm 4 spring spring-data spring-data-rest

创建SDR投影然后有什么区别

(i)在相应的知识库中明确声明如下 -

@RepositoryRestResource(excerptProjection = UserSummaryProjection.class)
public interface UserRepository extends JpaRepository<User, Integer> { ..
}
Run Code Online (Sandbox Code Playgroud)

(ii)未明确定义存储库中的投影

我发现当在Repository中显式声明Projection时,无论findAll还是findByID被调用,都会为该实体显示该投影.

但是当它没有被声明时,那么有一个选项留给用户/不使用它们,所以默认显示所有字段.

一些例子 -

我还发现,当定义投影时,链接会消失.例如 - 有UserLanguage和RefLanguage,说有2个存储库UserLanguageRepository和ResfLanguageRepository,那么还有RefLangSummaryProjection

UserLanguage - > ManytoOne - > REfLanguage RefLanguage - > OneToMany - > UserLanguage

因此,转到URL/userLanguages或/ userLanguages/{id}显示RefLanguage的嵌入数据,其中字段来自RefLangSummaryProjection并且链接到RefLang已消失.这可能是预期但我不喜欢为REFLangSummaryProejction生成的查询仍然选择所有列

Oli*_*ohm 7

预测基本上是双重的:

  1. 您可以创建投影以使客户端能够查看资源的不同视图.投影被定义为接口,命名然后通过请求参数向客户端公开.客户现在可以选择其中一个已注册的预测,也可以根本不选择任何一个.

  2. 您可以将其中一个已注册的投影提升为摘录投影(因此属性名称).如果声明,它将自动用于相关资源出现在表示中的位置.使用默认的HAL格式,这是在_embedded子句中呈现的所有内容的情况.