如何在 JSON 响应中 return 对象的特定部分

How to return specific part of object in JSON response

我尝试构建 Spring Rest 应用程序。当我为 return JSON 数据创建 class Activity 和控制器时,它总是 return 整个 ActivityDetail 列表,但通常我只想要一个(最后一项)或不是响应中的所有对象数据。

我现在该怎么办?创建对象 ActivityWithOneDetail 还是 ActivityWhitoutTitle?但是我怎样才能在不溢出数据库的情况下将必要的信息传递给这个对象呢?我认为获取 Activity 对象并从该对象创建另一个对象是没有意义的(activity 有存储库 public interface ActivityRepository extends JpaRepository { ... } 所以我可以简单地访问这个对象)。

我发现在实体和对象 return 中保持关系有很多问题,因为有时我想要 return 更多,有时更少来自控制器的数据,但是当我阻止将数据传递到 JSON 实体中的响应会影响所有控制器。这不是弹性解决方案,所以我想你可以给我另一个提示,我如何从我的控制器中 return JSON objects 并保持数据库的良好性能(我想从数据库中获取所有 @oneToMany 数据不是我应该在每个请求中做的)。

下面我贴了一部分我的代码,但是我觉得这个问题比较理论化。

@Entity
@Table(name = "ACTIVITY")
public class Activity {

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "CREATE_DATE")
    @Temporal(TemporalType.TIMESTAMP)
    @NotNull
    private Date createDate;

    @Column(name = "ACTIVE")
    @NotNull
    private Boolean active;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "ACTIVITY_USER", joinColumns = @JoinColumn(name = "ACTIVITY_ID", referencedColumnName = "ID"), inverseJoinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "ID"))
    @JsonBackReference
    private Set<User> users;

    @OneToMany(mappedBy = "activity_id")
    private List<ActivityDetail> activityDetails;

    @ManyToOne
    @JoinColumn(name = "ACTIVITY_OWNER")
    private User activityOwner;

    @OneToMany(mappedBy = "activityParent")
    @JsonBackReference
    private List<Task> activityTasks;
} 
// Constructor, Getter, Setter

我的部分构造函数雇佣:

 @RequestMapping(value = "/api/{userId}/activities", method = RequestMethod.GET)
    public List<Activity> activities(HttpServletRequest request, @PathVariable(value="userId") final Long id){
        User user = userRepository.findById(id);

        List<Activity> activities = activityRepository.findAllByUsers(user);

        return activities;
    }
@RequestMapping(value = "/api/{userId}/activities", method = RequestMethod.GET)
    public  Activity activities(HttpServletRequest request, @PathVariable(value="userId") final Long id){
        User user = userRepository.findById(id);

        List<Activity> activities = activityRepository.findAllByUsers(user);

        return activities.get(0);
    }

可能的方法很少:

1) 尝试使用 Spring Data Rest 及其 Projections 功能。 Here 是更多描述

2) 或者,如果您需要一些绝对灵活的方法,请尝试 this 方法。 GraphQL 是一种构建 REST API 的方法,其中客户端指定应检索的数据。

P.S。您始终可以从您的实体创建 DTO 对象。是的,它在运行时需要更多 类 和内存,但数据库没有问题。