【问题标题】:returning subset/subschema using spring data JPA使用spring数据JPA返回子集/子模式
【发布时间】:2014-03-27 17:22:54
【问题描述】:

我正在使用 spring 框架构建一个 REST API,并遇到了一个我似乎没有找到解决方案的不太有趣的案例。

假设我们有表 Table1,其中包含 Col1、Col2 和 Col3 列 我们有访问级别 1,2 和 3 的用户

访问级别 3 的用户是唯一允许访问 Col3 以及所有其他列的用户,其余用户可以访问其他任何内容。

此外,我希望 API 能够根据调用返回字段的子集,即:如果对 URL /table/list?fl=col1 进行了调用,则只会返回 Col1 的值.

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

我想知道在不完全放弃 JPA 或不必重写所有实体中的所有函数的情况下,最简洁的方法是什么。

【问题讨论】:

  • 我认为您要搜索的词是“查看”(en.wikipedia.org/wiki/View_(SQL))。
  • 我不会尝试使用 JPA 来解决这个问题,而是使用一些 DTO(如果只有三个角色并且它非常固定)。我不明白“/table/list?fl=col1”之类的请求的实际原因。
  • DTO 听起来是一个非常有趣的想法,但它会限制添加更多角色,并且不会帮助限制响应中的列。您想要这样做的主要原因是利用网络流量,如果您只使用 3 列,则返回 10 列将毫无意义。

标签: java spring spring-mvc jpa


【解决方案1】:

让我告诉你我的想法。

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

这是不正确的,JPA 允许检索实体的某些部分,当您在 @Query 方法的查询中选择特定列时不需要返回完整的实体,因为您使用 jpql 或本机查询,您应该只返回部分实体和spring数据会自动返回List,阅读更多here

现在要管理对我建议使用 Spring Security 实现某些方法的方法的访问,它允许使用 @PreAuthorize 注释某些方法

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

这意味着只有具有该角色的用户才能访问 “ROLE_USER”。

所以它会根据角色限制执行,所以我的建议是限制基于角色的访问,并有几个 spring jpa 方法来根据角色只检索列的子集。

另一种选择是创建动态 jpql 并直接在 entityManager 中执行,它可以让您使用 @SqlResultMapping 直接获取实体而不是对象列表进行映射。

【讨论】:

  • 这听起来很有趣,但这意味着我们必须根据需要返回的预定义静态字段集为每个用户规则实现一个函数。这可能是唯一的解决方案,但我真的想知道 spring 是否提供了开箱即用的东西来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
相关资源
最近更新 更多