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

时间:2014-12-16 09:14:18

标签: spring spring-data spring-data-rest

创建SDR投影之间有什么区别

(i)在相应的存储库中明确声明 -

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

(ii)未在存储库中明确定义Projection

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

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

一些例子 -

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

UserLanguage - &gt; ManytoOne - &gt; REfLanguage RefLanguage - &gt; OneToMany - &gt;用户语言

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

1 个答案:

答案 0 :(得分:7)

预测基本上是双重的:

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

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