2017-07-11 15 views
0

私はSpring Restアプリケーションを作成しようとしています。 JSONデータを返すためのActivityおよびControllerクラスを作成すると、常にActivityDetailという全体リストが返されますが、通常は1つだけ(最後の項目)、またはすべてのオブジェクトデータが応答しないようにします。JSONレスポンスでオブジェクトの特定の部分を返す方法

どうすればいいですか?オブジェクトActivityWithOneDetailまたはActivityWhitoutTitleを作成しますか?しかし、どのようにしてオーバーフローデータベースなしでこのオブジェクトに情報を渡すことができますか?私はそれがActivityオブジェクトを取得し、そのオブジェクトから他のオブジェクトを作成する意味がないと思う(アクティビティはリポジトリpublic interface ActivityRepository extends JpaRepository { ... }なので、このオブジェクトに簡単にアクセスできます)。

時々私はより多くの返したいので、私は、コントローラからのデータが少なく、他の時間、エンティティオブジェクトを返すでキープ関係での問題の多くを見るが、私は実体でJSONレスポンスにパスデータをブロックするときには、すべてのコントローラに影響を与えます。それは弾力的なソリューションではないので、あなたが私のコントローラーから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; 
    } 

答えて

0

いくつかの可能なアプローチがあります:

1)春データ休息とそのプロジェクション機能を使用してみてください。 Hereはもっと詳しくです

2)または、絶対に柔軟性が必要な場合は、thisにアクセスしてください。 GraphQLは、クライアントが検索する必要のあるデータを指定するREST APIを構築する手法です。

P.S.エンティティからDTOオブジェクトを作成することは常に可能です。はい、実行時にクラスとメモリが必要になりますが、データベースに問題はありません。

0
@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); 
    } 
+0

アクティビティオブジェクトのこの部分について尋ねます: 'private List activityDetails'、アクティビティオブジェクトの1つではありません。 –

関連する問題