使用Spring Data JPA返回子集/子模式

3
我正在使用Spring框架构建REST API,但遇到了一个不那么有趣的问题,我似乎找不到解决方法。
假设我们有一个名为Table1的表格,其列包括Col1,Col2和Col3,并且我们有访问级别为1、2和3的用户。
只有访问级别为3的用户才能访问Col3以及所有其他列,其他用户只能访问其他内容。
此外,我希望API能够根据调用返回字段的子集。例如:如果调用URL /table/list?fl=col1,仅返回Col1的值。
我需要的是一种在API级别返回此特定数据子集的方法,显然Spring Data JPA不允许返回动态子集。
我想知道在完全放弃JPA或不必重写所有实体中的所有函数的情况下完成此操作的最干净的方式是什么。

我认为你要查找的术语是“视图”(http://en.wikipedia.org/wiki/View_(SQL))。 - Smutje
我不会尝试使用JPA来解决这个问题,而是使用一些DTO(如果只有三个角色并且它非常固定)。我不理解“/table/list?fl=col1”这样的请求的实际原因。 - V G
DTOs听起来是一个非常有趣的想法,但它会在添加更多角色时有一定的限制,并且它不能帮助限制响应中的列。你想要这样做的主要原因是利用网络流量,如果你只使用3个列,那么返回10个列就没有意义了。 - amrnablus
1个回答

1

让我分享一下我的想法。

我需要的是一种返回API级别上特定数据子集的方法,显然Spring Data JPA不允许返回表的动态子集。

这是不正确的,JPA允许检索实体的某些部分,当您在@Query方法的查询中选择特定列时,不需要返回完整的实体,您只应返回实体的一部分,Spring Data会自动返回List,请阅读更多此处

现在为了管理方法的访问,我建议使用Spring Security来实现一些注释方法@PreAuthorize。

@PreAuthorize("hasRole('ROLE_USER')")
public void create(Contact contact);    

这意味着只允许具有"ROLE_USER"角色的用户访问。

因此,它将根据角色限制执行,我的建议是基于角色限制访问,并具有几个Spring JPA方法,根据角色仅检索子集列。

另一种选择是创建动态JPQL并直接在entityManager中执行,这将使您能够使用@SqlResultMapping映射直接获取实体,而不是对象列表。


这听起来像是一个有趣的想法,但它意味着我们需要为每个用户规则实现一个函数,返回一组预定义的静态字段。这可能是唯一的解决方案,但我真的很想知道Spring是否提供了开箱即用的解决方案来完成这个任务。 - amrnablus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接